On Jan 9, 2014, at 6:57 , Alp Toker <[email protected]> wrote:
> I'm not making an assertion. The standard is very clear on this:
>
>
> 17.6.4.3 Reserved names [reserved.names]
>
> If a program declares or defines a name in a context where it is reserved,
> other than as explicitly allowed by this Clause, its behavior is undefined.
>
> 17.6.4.3.2 Global names [global.names]
>
> Certain sets of names and function signatures are always reserved to the
> implementation:
>
> Each name that contains a double underscore __ or begins with an underscore
> followed by an uppercase letter (2.12) is reserved to the implementation for
> any use.
> Each name that begins with an underscore is reserved to the implementation
> for use as a name in the global namespace.
>
I know I shouldn't be getting into this, but...
1.3.24 undefined behavior [defns.undefined]
behavior for which this International Standard imposes no requirements
[ Note: Undefined behavior may be expected when this International Standard
omits any explicit definition of behavior or when a program uses an erroneous
construct or erroneous data. Permissible undefined behavior ranges from
ignoring the situation completely with unpredictable results, to behaving
during translation or program execution in a documented manner characteristic
of the environment (with or without the issuance of a diagnostic message), to
terminating a translation or execution (with the issuance of a diagnostic
message). Many erroneous program constructs do not engender undefined behavior;
they are required to be diagnosed. — end note ]
(emphasis mine)
As I read this, a valid interpretation of this program is that when
LEAK_SANITIZER is defined, the program contains undefined behavior, and
therefore it should only be set in a context when the particular implementation
is known to do something sensible for this particular undefined behavior (that
is, use the function at runtime to disable leak checking).
I don't see this as abstractly different from the standard-specified practice
of replacing the global operator new, so I don't think it's inherently an
anti-pattern. I think everyone agrees on this since you've said already you'd
have no objections if the name weren't one of the restricted [global.names]
names.
Would it help if the function were pre-declared in a system header, and then
just implemented or not implemented in user code?
Jordan
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits