MISRA Discussion Forums

Full Version: How do explicit casts of arguments affect 21.15 (amendment 1)?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
When rule 21.15 of MISRA C 2012 Amendment 1 refers to the types that pointer arguments are pointers to, how are explicit casts interpreted? Are the types that they are pointers to considered before or after the cast?

Code:
void f(signed char* a, int* b, size_t n) {
    memcmp(a, a, n); // ok - pointers to same type
    memcmp(b, b, n); // ok - pointers to same type
    memcmp((int*)b, (int*)b, n); // ok - same type and cast has no effect
    memcmp((int*)a, (int*)a, n); // ok? - cast to different pointer type, arguments match before and after but with different matching types
    memcmp(a, b, n); // violation - pointers to different types
    memcmp((int*)a, b, n); // violation? - types only match due to pointer cast
    memcmp((float*)a, (float*)b, n); // violation? - different pointer types cast to third common pointer type
    memcmp((short*)a, a, n); // violation? - original pointer types match before cast
}
Rule 21.15 applies to the types after casting.
Code:
void f(signed char* a, int* b, size_t n) {
    memcmp(a, a, n);                   // Compliant
    memcmp(b, b, n);                   // Compliant
    memcmp((int*)b, (int*)b, n);       // Compliant
    memcmp((int*)a, (int*)a, n);       // Compliant - but violates Rule 11.3
    memcmp(a, b, n);                   // Non-Compliant
    memcmp((int*)a, b, n);             // Compliant - but violates Rule 11.3
    memcmp((float*)a, (float*)b, n);   // Compliant - but violates Rules 11.3 and  21.16
    memcmp((short*)a, a, n);           // Non-Compliant - and also violates Rule 11.3
}