Issue: headers may use non-reserved identifiers

Brian Inglis Brian.Inglis@SystematicSw.ab.ca
Thu Apr 21 04:56:46 GMT 2022


On 2022-04-20 20:48, Richard Damon wrote:
> On 4/20/22 6:11 PM, C Howland wrote:
>> On Wednesday, April 20, 2022 4:35 PM, Pavel Morozkin wrote:
>>> Issue: headers may use non-reserved identifiers.
>>> Example:
>>> #define _reent 0
>>> #include <stdio.h>
>>> $ gcc t567.c -std=c11
>>> t567.c:1:16: error: expected ‘{’ before numeric constant
>>>      1 | #define _reent 0
>>>        |                ^
>>> t567.c:1:16: error: expected ‘{’ before numeric constant
>>>      1 | #define _reent 0
>>>        |                ^
>>> and so on...
>>> Per C11 _reent, _on_exit_args, etc. are non-reserved identifiers.
>>> Consider fixing.
>>> P.S. Good if it leads to compile time errors, not good if it
>>> doesn't (wrong translation unit produced => wrong code generated
>>> => wrong runtime behavior).
>> No, the headers do not use non-reserved identifiers. Look at the 
>> standard
>> again, as the second dash item in section 7.1.3 Reserved Identifiers
>> reserves all identifiers that start with underscore.  The example program
>> violates the standard.  In short, user programs may not use identifiers
>> that start with underscore.  (More precisely there are some very-limited
>> cases in which they can, but preprocessor identifiers is not one of 
>> them.)
> 
> Slight correction, identifies that begin with an underscore and followed 
> by a lowercase letter or a number are reserved only at 'file scope' 
> level, so user programs CAN use them as local variable names inside some 
> scope (at least those that don't match the previous cluase of an 
> underscore followed by an uppercase letter or another underscore as 
> those are reserved in all conditions).
> 
> Now, in the example, the user program used it for a preprocessor symbol 
> which conflicts with the reservation for that identifier for the 
> implementations use.

C202X WD (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.pdf) 
7.1.3 expands and simplifies it somewhat to all identifiers defined and 
all *potentially* reserved (including future library directions - see 
7.31) provided by the implementation are reserved for any use, but not 
if not provided, with conditions on header inclusion, namespace, and scope.

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
[Data in binary units and prefixes, physical quantities in SI.]


More information about the Newlib mailing list