MISRA Discussion Forums

Full Version: 13.5 for() loops - does simplicity matter?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have compiled the following code. The compiler accepts the first loop (ending at X) but rejects the other two (ending at X+2 and at X*2)

extern tUI16 X, Y;
void Fn( void )
{
tUI16 i;
for( i = 0u; i < X; i++ ) /* accepted */
{
Y += i;
}
for( i = 0u; i < (X + 2u); i++ ) /* rejected */
{
Y += i;
}
for( i = 0u; i < (X * 2u); i++ ) /* rejected */
{
Y += i;
}
}

The compiler suppliers say the compiler will accept the second expression if it is "a simple test" and that X+2 and X*2 do not pass this test. I feel this is being too restrictive for rule 13.5. Please may I have an opinion on this.

Thanks,

John
Rule 13.5 requires that the second expression include testing the loop counter but it doesn't place any other requirements on the test. MISRA C does not require a "simple test" in the second expression. All 3 of your examples are therefore compliant with Rule 13.5.

The concept of a loop counter is not well defined. In order to assist in identifying loop counters, tools may impose restrictions on the loop and may report violations of this rule even though the code is compliant.