Title
Missing support for round-tripping null pointer values through indirection/address operators
Status
tentatively ready
Section
C.7.4 [diff.expr]
Submitter
Richard Smith

Created on 2024-03-21.00:00:00 last changed 4 weeks ago

Messages

Date: 2024-05-17.22:24:28

Proposed resolution (approved by CWG 2024-05-17):

Add a new paragraph to C.7.4 [diff.expr] as follows:

Affected subclause: 7.6.2.2 [expr.unary.op]
Change: Taking the address of a dereferenced null or past-the-end pointer value is well-defined in C (and yields the original pointer value), but results in undefined behavior in C++. For example:
  void f() {
    char *p = 0;
    char *p2 = &*p;   // well-defined in C, undefined behavior in C++
    char *p3 = &p[0]; // well-defined in C, undefined behavior in C++
    int a[5];
    int *q = &a[5];   // well-defined in C, undefined behavior in C++
  }
Rationale: Consistent treatment of lvalues in C++.
Effect on original feature: Well-formed and well-defined C code exhibits undefined behavior in C++.
Difficulty of converting: Syntactic transformation to pointer arithmetic and possible addition of a check for null pointer values.
How widely used: Occasionally.
Date: 2024-05-17.22:24:28

C supports the following, C++ does not (see issues 232 and 2823):

  void f() {
    char *p = 0;
    char *p2 = &*p;       // OK in C, undefined behavior in C++
    int a[5];
    int *q = &a[5];       // OK in C, undefined behavior in C++
  }

This incompatibility should be documented in Annex C.

History
Date User Action Args
2024-05-17 22:24:28adminsetmessages: + msg7701
2024-05-17 22:24:28adminsetstatus: open -> tentatively ready
2024-03-21 00:00:00admincreate