Defect Report #109

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
Question
[Question was revised in Jun 94.]
ANSI/ISO C Defect Report #rfg16:
Does the C Standard draw any significant distinction between ``undefined values'' and ``undefined behavior?'' (It appears that it does, but if it does, that fact is not always apparent.)
Just to give two examples which, it would appear, involve the generation (in a running program) of undefined values (as opposed to totally undefined behavior at either compile-time or link-time or run-time) I provide the following two citations.
Subclause 6.3.8 Relational operators:
If the objects pointed to are not members of the same aggregate or union object, the result is undefined,...
(Emphasis added.)
Subclause 7.5.2.1 The acos function:
A domain error occurs for arguments not in the range [-1,+1].
The issue of ``undefined values'' versus ``undefined behavior'' has great significance and importance to people doing compiler testing. It is generally accepted that the C Standard's use of the term ``undefined behavior'' is meant to imply that absolutely anything can happen at any time, e.g. at compile-time, at link-time, or at run-time. Thus, people testing compilers must either totally avoid writing test cases which involve any kind of ``undefined behavior'' or else they must treat any such test cases which they do write as strictly ``quality of implementation'' tests which may validly cause errors at compile-time, at link-time, or at run-time.
If however the C Standard recognizes the separate existence of ``undefined values'' (whose mere creation does not involve wholly ``undefined behavior'') then a person doing compiler testing could write a test case such as the following, and he/she could also expect (or possibly demand) that a conforming implementation should, at the very least, compile this code (and possibly also allow it to execute) without ``failure.''
int array1[5];
int array2[5];
int *p1 = &array1[0];
int *p2 = &array2[0];

int foo()
{
int i;
i = (p1 > p2); /*
Must this be "successfully translated"? */
1/0; /*
Must this be "successfully translated"? */
return 0;
}

So the bottom line question is this: Must the above code be ``successfully translated'' (whatever that means)? (See the footnote attached to subclause 5.1.1.3.)
Response
The C Standard uses the term ``indeterminately valued'' not ``undefined value.'' Use of an indeterminate valued object results in undefined behavior.
The footnote to subclause 5.1.1.3 points out that an implementation is free to produce any number of diagnostics as long as a valid program is still correctly translated.
If an expression whose evaulation would result in undefined behavior appears in a context where a constant expression is required, the containing program is not strictly conforming. Furthermore, if every possible execution of a given program would result in undefined behavior, the given program is not strictly conforming.
A conforming implementation must not fail to translate a strictly conforming program simply because some possible execution of that program would result in undefined behavior. Because foo might never be called, the example given must be successfully translated by a conforming implementation.
Previous Defect Report < - > Next Defect Report