On 09/01/2014 21:12, Sean Silva wrote:



On Thu, Jan 9, 2014 at 12:49 PM, Alp Toker <[email protected] <mailto:[email protected]>> wrote:

    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.


I'm not sure if you're aware of this Alp, but using a reserved "weak" symbol is a classic and widely used way to expose "hooks" into runtime libraries/instrumentation.

http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html
http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx
__libc_malloc_dispatch in bionic libc

The alternative is usually a function called by the user code in main() or whatever, which takes a function pointer.

Yes, we discussed this earlier.

That use case falls under permissible undefined behaviour, if and only if the implementation (of which the C library is a part) permits it.

Not just bionic libc but glibc and others system components including the sanitizer control function in discussion have weak symbols, often prefixed "__" like this exposed as hooks which user code is free to define and override.

What's not OK is to define the reserved names when a _different_ C library or implementation is in use, and the wording in the standard makes it clear the intention is to prevent implementations stepping on one another.

Alp.




-- Sean Silva


    Cheers
    Alp.



    On 09/01/2014 17:52, Jordan Rose wrote:


        On Jan 9, 2014, at 9:42 , Alp Toker <[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>> wrote:


            On 09/01/2014 17:30, Jordan Rose wrote:


                On Jan 9, 2014, at 6:57 , Alp Toker <[email protected]
                <mailto:[email protected]> <mailto:[email protected]
                <mailto:[email protected]>><mailto:[email protected]
                <mailto:[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?


            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

    _______________________________________________
    cfe-commits mailing list
    [email protected] <mailto:[email protected]>
    http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



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

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to