09-12-2016, 09:07 AM
First some background on the C standard conversions in switch statements.
The actual check that should be performed is between the essential type of the case label expression and the essential type of controlling expression.
We agree that the wording is not clear and will clarify it in a later version.
In the example given by dg1980, "x" will be promoted from uint8_t ( assumed to be unsigned char ) to the C standard type of "signed int" if all the values of "unsigned char" fit in the "signed int" ( assumed to be 32-bit). The C standard type of "-1" is "signed int".
This is not compliant with rule 10.3. It will also violate rule 2.1 as suggested.
Quote:C99 6.8.4.2(5) The integer promotions are performed on the controlling expression. The constant expression in each case label is converted to the promoted type of the controlling expression.The Amplification is written in a way which describes the relevent conversion in the C standard.
The actual check that should be performed is between the essential type of the case label expression and the essential type of controlling expression.
We agree that the wording is not clear and will clarify it in a later version.
In the example given by dg1980, "x" will be promoted from uint8_t ( assumed to be unsigned char ) to the C standard type of "signed int" if all the values of "unsigned char" fit in the "signed int" ( assumed to be 32-bit). The C standard type of "-1" is "signed int".
This is not compliant with rule 10.3. It will also violate rule 2.1 as suggested.
Posted by and on behalf of the MISRA C Working Group