MISRA Discussion Forums
Gotos in switches and Rule 6-4-5 - Printable Version

+- MISRA Discussion Forums (https://forum.misra.org.uk)
+-- Forum: MISRA C++ (https://forum.misra.org.uk/forumdisplay.php?fid=18)
+--- Forum: MISRA C++:2008 rules (https://forum.misra.org.uk/forumdisplay.php?fid=19)
+---- Forum: 6.6 Statements (C++) (https://forum.misra.org.uk/forumdisplay.php?fid=135)
+---- Thread: Gotos in switches and Rule 6-4-5 (/showthread.php?tid=1477)



Gotos in switches and Rule 6-4-5 - rgamble - 01-03-2019

Consider the following example:
Code:
typedef unsigned short uint16_t;
uint16_t foo(uint16_t x) {
    switch(x) {
        case 1:
            { goto end; }
        case 2:
            ++x;
            break;
        default:
            break;
    }  
end:
    ++x;
    return x;
}
The first case containing the goto appears to violate rule 6-4-5 which states that a case must end in a break or throw statement. If a break is added anywhere after the goto, it will be unreachable and would seemingly violate Rule 0-1-1 which forbids unreachable code. Rule 6-4-3 seems to consider the use of goto in a switch as it says that jump-statements (which includes goto) "are permitted within the compound statements forming the body of a switch-clause". Is it intended that an unconditional goto in a switch will require a deviation from either 6-4-5 or 0-1-1?


Re: Gotos in switches and Rule 6-4-5 - misra cpp - 10-04-2019

You are right, your example violates 6-4-5.

When 6-4-3 says jump-statements (which includes goto) "are permitted within the compound statements forming the body of a switch-clause",
it means that you can write code like:
switch(x) {
case 1:
{ goto l1;
// some code
l1:
// more code
break;
}
case 2:
++x;
break;
default:
break;
}

not that you can use goto to leave the switch statement or jump out of the compound statement following the "case" keyword.