[[ISO/IEC 9899-1999]] enumerates several instances where the behavior of accessing the object or function expanded to be a standard library macro definition is undefined .
The macros are assert
, errno
, math_errhandling
, setjmp
, va_start
, va_arg
, va_copy
, and va_end
.
These cases are recorded in the list of undefined behavior , items 104 , 108 , 116 , 118 and 130 .
Programmers should never attempt to access anything underlying any of these macros.
Noncompliant Code Example (assert)
In this example, a programmer working with a known <assert.h> is attempting to subvert the standard assert
functionality so that assertions are always made, regardless of whether ndebug
is set.
#include <assert.h> #undef assert void myassert(int e) { __assert13(__FILE__, __LINE__, __assert_function__, e); }
This call results in undefined behavior, so the programmer can now never rely on assertions, even in debug builds.
Compliant Solution (assert)
In this solution, the programmer does not #undef a standard macro, and explicitly handles any release-build assertion checks.
#include <assert.h> void myassert(int e) { assert(e); /* other verification ... */ }
Risk Assessment
Accessing objects or function underlying these macros does not produce defined behavior, which may lead to incorrect or unexpected program behavior.
Rule |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
MSC38-C |
low |
unlikely |
medium |
P2 |
L3 |
References
[[ISO/IEC 9899:1999]], all sections indicated by the undefined behavior items noted above.
koders.com, <assert.h> source.