MISRA Discussion Forums

Full Version: Rule 11.1, 11.2 (and others?) vs conversion caused by equality operators (and similar)?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

rules 11.1 and 11.2 disallow conversions between pointer to a function or incomplete type, and any other type:

Code:
void (*fp1)(short);
void (*fp2)(int);

fp2 = fp1;          /* Not-compliant - different function */
fp2 = 0x8000;       /* Not-compliant - integer */

What if the conversion happens for example in equality operator:
Code:
fp2 == fp1;         /* Compliant or Not-compliant ? */
fp2 != 0x8000;      /* Compliant or Not-compliant ? */

Following example from Rule 11.1 suggests it's also non-compliant:
Code:
if ( fp2 != NULL )  /* Compliant - exception 1 (NULL) */
The rules in section 11 cover the implicit and explicit conversions that are permitted by the C standard. It does not matter whether these conversions occurring in an assigning context ( fp2 = fp1 ) or a balancing context ( fp2 == fp1 ).

Therefore the compliance of your examples are as follows:
Code:
fp2 == fp1;         /* Not-compliant */
fp2 != 0x8000;      /* Not-compliant  */
if ( fp2 != NULL )  /* Compliant - exception 1 on NULL */