Defect Report #166

Submission Date: 16 Oct 95
Submittor: BSI
Source: Clive D.W. Feather
Question
Submitted to BSI by Clive D.W. Feather [email protected] .
In this Defect Report, identifiers lexically identical to those declared in standard headers refer to the identifiers declared in those standard headers, whether or not the header is explicitly mentioned.
This Defect Report has been prepared with considerable help from Mark Brader, Jutta Degener, Ronald Guilmette, and a person whose employment conditions require anonymity. However, except where stated, opinions expressed or implied should not be assumed to be those of any person other than myself.
Defect Report UK 014: Meaning of lvalue
Constraints that require something to be an lvalue place an unacceptable burden on the implementation.
Subclasue 6.2.2.1 states in part:
An lvalue is an expression (with an object type or an incomplete type other than void) that designates an object.
Given the declaration
int a[10], i;
the expression a[i] designates an object, and is thus an lvalue, if and only if i has a value between 0 and 9 inclusive (see Defect Report #076 for further details). Now consider the Constraint in subclause 6.3.3.2:
The operand of the unary & operator shall be either a function designator or an lvalue that designates an object ...
This means that the expression &a[i] is a constraint violation whenever i has a value outside the range 0 to 9 inclusive, and that therefore a diagnostic is required, at run-time!
The defect is that the operand of the unary & operator does not need to be an lvalue that designates an object, but rather an lvalue which, if evaluated with its operands having suitable values, could designate an object.
There are probably other parts of the C Standard with the same problem, such as subclauses 6.3.2.4, 6.3.3.1, and 6.3.16.
Previous Defect Report < - > Next Defect Report