r233860 - [UBSan] Embed UBSan into ASan runtime (Clang part).

Alexey Samsonov vonosmas at gmail.com
Thu Apr 2 18:21:16 PDT 2015


Yes, I think it would be possible to combine UBSan with TSan and MSan in
the same way. I planned to do experiment with that soon.

On Thu, Apr 2, 2015 at 5:56 PM, Richard Smith <richard at metafoo.co.uk> wrote:

> That's unfortunate; "can be used in any build without restrictions" used
> to be one of UBSan's selling points. Would we be able to make these work
> again by linking the UBSan runtime in the MSan and TSan ones too, or is the
> issue more complicated than that?
>
>
> On Thu, Apr 2, 2015 at 4:53 PM, Alexey Samsonov <vonosmas at gmail.com>
> wrote:
>
>> UBSan+MSan and UBSan+TSan combinations are currently not supported. We
>> print a diagnostic in this case.
>>
>> On Thu, Apr 2, 2015 at 3:24 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>>
>>> How does this affect UBSan + MSan and UBSan + TSan builds?
>>>
>>> On Wed, Apr 1, 2015 at 3:42 PM, Alexey Samsonov <vonosmas at gmail.com>
>>> wrote:
>>>
>>>> Author: samsonov
>>>> Date: Wed Apr  1 17:42:25 2015
>>>> New Revision: 233860
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=233860&view=rev
>>>> Log:
>>>> [UBSan] Embed UBSan into ASan runtime (Clang part).
>>>>
>>>> Summary:
>>>> Change the way we use ASan and UBSan together. Instead of keeping two
>>>> separate runtimes (libclang_rt.asan and libclang_rt.ubsan), embed UBSan
>>>> into ASan and get rid of libclang_rt.ubsan. If UBSan is not supported on
>>>> a platform, all UBSan sources are just compiled into dummy empty object
>>>> files. UBSan initialization code (e.g. flag parsing) is directly called
>>>> from ASan initialization, so we are able to enforce correct
>>>> initialization order.
>>>>
>>>> This mirrors the approach we already use for ASan+LSan. This change
>>>> doesn't
>>>> modify the way we use standalone UBSan.
>>>>
>>>> Test Plan: regression test suite
>>>>
>>>> Reviewers: kubabrecka, zaks.anna, kcc, rsmith
>>>>
>>>> Subscribers: cfe-commits
>>>>
>>>> Differential Revision: http://reviews.llvm.org/D8645
>>>>
>>>> Modified:
>>>>     cfe/trunk/lib/Driver/SanitizerArgs.cpp
>>>>     cfe/trunk/lib/Driver/ToolChains.cpp
>>>>     cfe/trunk/lib/Driver/Tools.cpp
>>>>     cfe/trunk/test/Driver/sanitizer-ld.c
>>>>
>>>> Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=233860&r1=233859&r2=233860&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original)
>>>> +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Wed Apr  1 17:42:25 2015
>>>> @@ -159,7 +159,8 @@ static bool getDefaultBlacklist(const Dr
>>>>  }
>>>>
>>>>  bool SanitizerArgs::needsUbsanRt() const {
>>>> -  return !UbsanTrapOnError && hasOneOf(Sanitizers, NeedsUbsanRt);
>>>> +  return !UbsanTrapOnError && hasOneOf(Sanitizers, NeedsUbsanRt) &&
>>>> +         !Sanitizers.has(SanitizerKind::Address);
>>>>  }
>>>>
>>>>  bool SanitizerArgs::requiresPIE() const {
>>>>
>>>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=233860&r1=233859&r2=233860&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
>>>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Apr  1 17:42:25 2015
>>>> @@ -338,6 +338,9 @@ void DarwinClang::AddLinkSanitizerLibArg
>>>>                                      OS + "_dynamic.dylib").str(),
>>>>                      /*AlwaysLink*/ true, /*IsEmbedded*/ false,
>>>>                      /*AddRPath*/ true);
>>>> +  // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
>>>> +  // all RTTI-related symbols that UBSan uses.
>>>> +  CmdArgs.push_back("-lc++abi");
>>>>  }
>>>>
>>>>  void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
>>>> @@ -401,9 +404,6 @@ void DarwinClang::AddLinkRuntimeLibArgs(
>>>>            << "-fsanitize=undefined";
>>>>      } else {
>>>>        AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
>>>> -      // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
>>>> -      // all RTTI-related symbols that UBSan uses.
>>>> -      CmdArgs.push_back("-lc++abi");
>>>>      }
>>>>    }
>>>>
>>>>
>>>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=233860&r1=233859&r2=233860&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>>>> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Apr  1 17:42:25 2015
>>>> @@ -2307,18 +2307,10 @@ collectSanitizerRuntimes(const ToolChain
>>>>      StaticRuntimes.push_back("msan");
>>>>    if (SanArgs.needsTsanRt())
>>>>      StaticRuntimes.push_back("tsan");
>>>> -  // WARNING: UBSan should always go last.
>>>>    if (SanArgs.needsUbsanRt()) {
>>>> -    // Check if UBSan is combined with another sanitizers.
>>>> -    if (StaticRuntimes.empty()) {
>>>> -      StaticRuntimes.push_back("ubsan_standalone");
>>>> -      if (SanArgs.linkCXXRuntimes())
>>>> -        StaticRuntimes.push_back("ubsan_standalone_cxx");
>>>> -    } else {
>>>> -      StaticRuntimes.push_back("ubsan");
>>>> -      if (SanArgs.linkCXXRuntimes())
>>>> -        StaticRuntimes.push_back("ubsan_cxx");
>>>> -    }
>>>> +    StaticRuntimes.push_back("ubsan_standalone");
>>>> +    if (SanArgs.linkCXXRuntimes())
>>>> +      StaticRuntimes.push_back("ubsan_standalone_cxx");
>>>>    }
>>>>  }
>>>>
>>>>
>>>> Modified: cfe/trunk/test/Driver/sanitizer-ld.c
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sanitizer-ld.c?rev=233860&r1=233859&r2=233860&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/test/Driver/sanitizer-ld.c (original)
>>>> +++ cfe/trunk/test/Driver/sanitizer-ld.c Wed Apr  1 17:42:25 2015
>>>> @@ -227,8 +227,7 @@
>>>>  // RUN:   | FileCheck --check-prefix=CHECK-ASAN-UBSAN-LINUX %s
>>>>  // CHECK-ASAN-UBSAN-LINUX: "{{.*}}ld{{(.exe)?}}"
>>>>  // CHECK-ASAN-UBSAN-LINUX: "-whole-archive"
>>>> "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive"
>>>> -// CHECK-ASAN-UBSAN-LINUX: "-whole-archive"
>>>> "{{.*}}libclang_rt.ubsan-i386.a" "-no-whole-archive"
>>>> -// CHECK-ASAN-UBSAN-LINUX-NOT: libclang_rt.ubsan_cxx
>>>> +// CHECK-ASAN-UBSAN-LINUX-NOT: libclang_rt.ubsan
>>>>  // CHECK-ASAN-UBSAN-LINUX-NOT: "-lstdc++"
>>>>  // CHECK-ASAN-UBSAN-LINUX: "-lpthread"
>>>>
>>>> @@ -238,8 +237,8 @@
>>>>  // RUN:   | FileCheck --check-prefix=CHECK-ASAN-UBSAN-LINUX-CXX %s
>>>>  // CHECK-ASAN-UBSAN-LINUX-CXX: "{{.*}}ld{{(.exe)?}}"
>>>>  // CHECK-ASAN-UBSAN-LINUX-CXX: "-whole-archive"
>>>> "{{.*}}libclang_rt.asan-i386.a" "-no-whole-archive"
>>>> -// CHECK-ASAN-UBSAN-LINUX-CXX: "-whole-archive"
>>>> "{{.*}}libclang_rt.ubsan-i386.a" "-no-whole-archive"
>>>> -// CHECK-ASAN-UBSAN-LINUX-CXX: "-whole-archive"
>>>> "{{.*}}libclang_rt.ubsan_cxx-i386.a" "-no-whole-archive"
>>>> +// CHECK-ASAN-UBSAN-LINUX-CXX: "-whole-archive"
>>>> "{{.*}}libclang_rt.asan_cxx-i386.a" "-no-whole-archive"
>>>> +// CHECK-ASAN-UBSAN-LINUX-CXX-NOT: libclang_rt.ubsan
>>>>  // CHECK-ASAN-UBSAN-LINUX-CXX: "-lstdc++"
>>>>  // CHECK-ASAN-UBSAN-LINUX-CXX: "-lpthread"
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>
>>>
>>>
>>
>>
>> --
>> Alexey Samsonov
>> vonosmas at gmail.com
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>


-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150402/4031102b/attachment.html>


More information about the cfe-commits mailing list