On 09/01/2014 16:49, Kostya Serebryany wrote:



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


    On 09/01/2014 15:23, Kostya Serebryany wrote:


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


            On 09/01/2014 12:13, Chandler Carruth wrote:


                    Who controls / defines the interface?


                The sanitizers.


            Can you report a bug with them?


        That's us (no need to file a separate bug unless you want to)


    That's fantastic. A proper resolution might be in sight in that
    case..




            Moreover, it's blocking work on a practical level by
        triggering
            legitimate build issues in at least one configuration.
        Removing
            the function doesn't break anything and resolves the issues. I
            don't see the problem here?


        Will you get unblocked if we put this code under #ifdef
        LEAK_SANITIZER ?
        Alternatively you may probably build the code with
        -D__lsan_is_turned_off=something_else


    If conditionalizing turns out to be necessary, it seems best to
    not to enable the function definition unless it's explicitly leak
    sanitizer build.

    However I'm starting to understand what you were trying to achieve
    and have a much better proposal below..



        Do you have suggestions how to improve the interface


    We should be able to find a name or mechanisms to do this
properly, given that you have control over the interface.


        w/o risking to clash with user-defined names?


    That right there appears to be the point of confusion.

    The problem is that you've required users to declare a function
    name that should have been reserved for the implementation.

    I said earlier this appears to be a "thinko" in the sanitizer
    interface. I said that because, for the majority of sanitizer
    functions, you're dealing with the reverse problem, and that
    appears to have leaked into the naming of these functions
    unintentionally.

    So it's not a question of avoiding a clash with user-defined
    names, but the other way round.

    In summary, the problem you need to solve is identical to the
    naming choices when declaring an entry point in a public C
    programming interface.

    Try naming this like any C API function (which is what it is) and
    you'll have a solution. Some good LLVM-style function name
    conventions are "include/llvm-c/Core.h" assuming you want to go
    with the LLVM CamelCase style.

    With this approach, you have the same risk of conflict as any C
    function, which is a well-understood problem space. The sanitizer
    is then free to give this symbol name special handling internally
    without imposing on others.

    If you do this there's no need to conditionalize, but please
    retain the comment explaining the purpose so it doesn't get
    "cleaned up".

    Thanks for inviting a discussion Kostya. Does that sound good to you?


So, you propose to name this function lsan_is_turned_off (or some such) instead of __lsan_is_turned_off?

include/sanitizer/lsan_interface.h- // The user may optionally provide this function to disallow leak checking include/sanitizer/lsan_interface.h- // for the program it is linked into (if the return value is non-zero). This include/sanitizer/lsan_interface.h- // function must be defined as returning a constant value; any behavior beyond
include/sanitizer/lsan_interface.h-  // that is unsupported.
include/sanitizer/lsan_interface.h:  int __lsan_is_turned_off();

The flaw is above. The user can't portably provide this function because declaring or defining a function with the reserved name is undefined behaviour.

That function is very different from the rest of lsan_interface.h and the correct way to provide it is as a C function with an ordinary API-style name that the user can legally define.

That will work, but then there is a non-zero chance that a user will already have such function for whatever purposes of his own.

There is always a non-zero chance of conflict with any C function.

LLVMContextCreate() has been part of the LLVM C API for years and conflict hasn't been an issue, any more than it would be with a LSANShouldDisableSanitizer() weak function.

To put this another way, even if "__" were hypothetically not reserved, your approach would still be flawed because the user might as well have declared a __lsan_is_turned_off() function for whatever reason.

In this case, the problem is bigger because "__" is reserved, so what you have now has a 100% chance of conflicting by definition.

My suggestion is that, if it's important to you to not to introduce unprefixed names in lsan_interface.h, just put the LSANShouldDisableSanitizer() declaration in a separate lsan_control.h header file that's include only at the point of use in a single TU.

What's worth, he will not know about the clash at the link time -- his program will start behaving wrongly. The __ prefix is exactly the tool that allows us to avoid a clash with user-named objects.

The "__" names are reserved for the implementation.

Right now there's a function declaration sitting in the middle of TableGen defining a function with a reserved name which is orthogonal to what you want.

Alp.



Or I've got you wrong?




    Alp.





        --kcc


            Anyway, I'm returning to the office to deal with this and I'm
            disappointed you've tried to push it through unilaterally with
            disregard for anyone outside of your own circle.


            Alp.

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



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



--
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