C and C++


LANG.CAST.PC.AO : Cast: Non-integer Arithmetic Type/Object Pointer

Summary

A cast between a pointer to object and one of the following types (as defined by the MISRA C 2012 standard): 'essentially Boolean', 'essentially character', 'essentially enum', 'essentially floating'.

Properties

Class Name Cast: Non-integer Arithmetic Type/Object Pointer
Significance reliability
Mnemonic LANG.CAST.PC.AO
Categories
MisraC2023 MisraC2023:11.7 A cast shall not be performed between pointer to object and a non-integer arithmetic type
Misra2012 Misra2012:11.7 A cast shall not be performed between pointer to object and a non-integer arithmetic type
Misra2004 Misra2004:11.2 Conversions shall not be performed between a pointer to object and any type other than an integral type, another pointer to object type or a pointer to void
CWE CWE:704 Incorrect Type Conversion or Cast
TS17961 TS17961:5.1-ptrcomp 5.1. Accessing an object through a pointer to an incompatible type
JSF++ JSF++:182 Type casting from any type to or from pointers shall not be used.
  JSF++:183 Every possible measure should be taken to avoid type casting.
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Cast: Non-integer Arithmetic Type/Object Pointer"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

void use_pointers(int* x, int *y);
void use_chars(char a, char b);

void PC_AtoO(char c){
    int *pi = (int *)c; /* 'Cast: Non-integer Arithmetic Type/Object Pointer' warning issued here */
    int *cpi = c;              /* not a cast */
    use_pointers(pi, cpi);
}

void PC_OtoA(int *pi){
    char c = (char) pi; /* 'Cast: Non-integer Arithmetic Type/Object Pointer' warning issued here */
    char cc = pi;              /* not a cast */
    use_chars(c, cc);
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.