r198858 - Disable LeakSanitizer in TableGen binaries, see PR18325

Alp Toker alp at nuanti.com
Thu Jan 9 11:49:35 PST 2014


OK, sorry I only just got round to this. Backed out in r198884 and r198885.

In principle it's OK to re-land this with the ifdef Jordan suggested, 
but I think it'd be more sustainable to try using non-reserved 
identifiers for the library part of the sanitizer interface if you have 
time to look into that.

Cheers
Alp.



On 09/01/2014 17:52, Jordan Rose wrote:
>
> On Jan 9, 2014, at 9:42 , Alp Toker <alp at nuanti.com 
> <mailto:alp at nuanti.com>> wrote:
>
>>
>> On 09/01/2014 17:30, Jordan Rose wrote:
>>>
>>> On Jan 9, 2014, at 6:57 , Alp Toker <alp at nuanti.com 
>>> <mailto:alp at nuanti.com><mailto:alp at nuanti.com>> 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?
>>
>> Hi Jordan,
>>
>> That's the current situation -- as long as sanitizer headers are 
>> available and in use the part of the spec you highlighted means it's 
>> acceptable.
>>
>> The problem arises when sanitizer headers aren't available.
>
> I just don't think the program is illegal when LEAK_SANITIZER is not 
> defined. The tokens within the #ifdef are skipped completely, so they 
> don't refer to names and certainly don't declare anything.
>
> I'm not sure we should care about the case where LEAK_SANITIZER is 
> defined in an environment that doesn't specify what defining this 
> particular name will do. The user has full control over this. (And in 
> fact, IIRC being able to define macros on the command line isn't at 
> all specified by the standard, so the program by itself will 
> /always/ skip the LEAK_SANITIZER block.)
>
> Jordan
>

-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list