Defect Report #133

Submission Date: 03 Dec 93
Submittor: WG14
Source: Project Editor (P.J. Plauger)
Question
Undefined behavior not previously listed in subclause G2:
1. Applying sizeof to an enumerate type, as in
enum f {c = sizeof (enum f)}
has undefined behavior.
2. A program containing no function called main has undefined behavior.
3. A storage class specifier or type-qualifier modifying the keyword void as a function parameter-type-list has undefined behavior.
4. Indexing an array beyond its specified size, as in:
int a[4][5];
a[1][7] = 0;

has undefined behavior.
5. If a ``shall'' or ``shall not'' requirement that appears outside of a constraint is violated, the behavior is undefined.
6. In pointer-integer conversion, the size of integer required and the result are implementation-defined. If the space provided is not long enough, the behavior is undefined.
7. The result of the % operator is the remainder. In both this and the divide operations, if the value of the second operand is zero, the behavior is undefined.
8. As with any other arithmetic overflow, if the result does not fit in the space provided, the behavior is undefined.
9. If a file with the same name as a standard header, not provided as part of the implementation, is placed in any of the standard places for a source file to be included, the behavior is undefined.
10. If the signal handler func(int sig) executes a return statement and the value of sig was SIGFPE or any other implementation-defined value corresponding to a computational exception, the behavior is undefined.
11. If any signal is generated by an asynchronous signal handler, the behavior is undefined.
12. If copying takes place between objects that overlap, the behavior is undefined.
13. If a fully expanded macro replacement list contains a function-like macro name as its last preprocessing token, it is unspecified whether this macro name may be subsequently replaced. If the behavior of the program depends upon this unspecified behavior, then the behavior is undefined. For example:
#define f(a) a*g
#define g(a) f(a)

the invocation f(2) (9) results in undefined behavior.
14. A call to a library function that exceeds an Environmental limit has undefined behavior.
Response
The C Standard makes it sufficiently clear that the described behaviors are undefined. The next revision of the C Standard can include a more comprehensive list.
Previous Defect Report < - > Next Defect Report