The C Standard, subclause 7.1.4 paragraph 1, states [ISO/IEC 9899:2011]:
...
However, the C Standard enumerates specific exceptions in which the behavior of accessing an object or function expanded to be a standard library macro definition is undefined. The macros are :assert
...
, errno
...
, math_errhandling
...
, setjmp
, va_arg
...
, va_copy
...
, va_end
...
These , and va_start
. These cases are described by undefined behaviors 110, 114, 122, 124, and 138. Programmers must not suppress these macros to access the underlying object or function.
Noncompliant Code Example (assert
)
In this noncompliant code example, the standard assert()
macro is suppressed in an attempt to pass it as a function pointer to the execute_handler()
function. Attempting to suppress the assert()
macro is undefined behavior.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <assert.h> typedef void (*handler_type)(int); void execute_handler(handler_type handler, int value) { handler(value); } void func(int e) { execute_handler(&(assert), e < 0); } |
...
In this compliant solution, the assert()
macro is wrapped in a helper function, removing the undefined behavior:
Code Block | ||||
---|---|---|---|---|
| ||||
#include <assert.h> typedef void (*handler_type)(int); void execute_handler(handler_type handler, int value) { handler(value); } static void assert_handler(int value) { assert(value); } void func(int e) { execute_handler(&assert_handler, e < 0); } |
...
Legacy code is apt to include an incorrect declaration, such as the following in this noncompliant code example:
Code Block | ||||
---|---|---|---|---|
| ||||
extern int errno; |
Compliant Solution (Declaring errno
)
The This compliant solution demonstrates the correct way to declare errno
is to include by including the header <errno.h>
:
Code Block | ||||
---|---|---|---|---|
| ||||
#include <errno.h> |
...
Accessing objects or functions underlying these the specific macros results enumerated in this rule is undefined behavior.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
MSC38-C | Low | Unlikely | Medium | P2 | L3 |
...
Bibliography
ISO/IEC 9899:2011 | Subclause 7.1.4, "Use of Library Functions" |
...