MISRA Discussion Forums
Rule 11.1, 11.2 (and others?) vs conversion caused by equality operators (and similar)? - Printable Version

+- MISRA Discussion Forums (https://forum.misra.org.uk)
+-- Forum: MISRA C (https://forum.misra.org.uk/forumdisplay.php?fid=4)
+--- Forum: MISRA C:2012 and MISRA C:2023 guidelines (https://forum.misra.org.uk/forumdisplay.php?fid=21)
+---- Forum: 8.11 Pointer type conversions (https://forum.misra.org.uk/forumdisplay.php?fid=166)
+---- Thread: Rule 11.1, 11.2 (and others?) vs conversion caused by equality operators (and similar)? (/showthread.php?tid=1184)



Rule 11.1, 11.2 (and others?) vs conversion caused by equality operators (and similar)? - pkruk - 03-06-2015

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) */



Re: Rule 11.1, 11.2 (and others?) vs conversion caused by equality operators (and similar)? - misra-c - 25-06-2015

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 */