[compiler-rt] r214833 - [UBSan] Allow to suppress reports from vptr checker for specified types.
Alexey Samsonov
vonosmas at gmail.com
Tue Aug 5 15:44:35 PDT 2014
Thanks for the fix!
On Tue, Aug 5, 2014 at 4:21 AM, Alexander Kornienko <alexfh at google.com>
wrote:
>
> On Tue, Aug 5, 2014 at 3:24 AM, Alexey Samsonov <vonosmas at gmail.com>
> wrote:
>
>> Author: samsonov
>> Date: Mon Aug 4 20:24:22 2014
>> New Revision: 214833
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=214833&view=rev
>> Log:
>> [UBSan] Allow to suppress reports from vptr checker for specified types.
>>
>> Based on http://reviews.llvm.org/D4702 by Byoungyoung Lee!
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.cc
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.h
>>
>> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc
>> compiler-rt/trunk/lib/ubsan/ubsan_diag.cc
>> compiler-rt/trunk/lib/ubsan/ubsan_diag.h
>> compiler-rt/trunk/lib/ubsan/ubsan_handlers_cxx.cc
>> compiler-rt/trunk/lib/ubsan/ubsan_init.cc
>> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr.cpp
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.cc?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.cc Mon
>> Aug 4 20:24:22 2014
>> @@ -22,8 +22,8 @@
>> namespace __sanitizer {
>>
>> static const char *const kTypeStrings[SuppressionTypeCount] = {
>> - "none", "race", "mutex", "thread",
>> - "signal", "leak", "called_from_lib", "deadlock"};
>> + "none", "race", "mutex", "thread", "signal",
>> + "leak", "called_from_lib", "deadlock", "vptr_check"};
>>
>> bool TemplateMatch(char *templ, const char *str) {
>> if (str == 0 || str[0] == 0)
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.h?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.h
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_suppressions.h Mon
>> Aug 4 20:24:22 2014
>> @@ -27,6 +27,7 @@ enum SuppressionType {
>> SuppressionLeak,
>> SuppressionLib,
>> SuppressionDeadlock,
>> + SuppressionVptrCheck,
>> SuppressionTypeCount
>> };
>>
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc
>> Mon Aug 4 20:24:22 2014
>> @@ -66,11 +66,13 @@ TEST(Suppressions, TypeStrings) {
>> CHECK(!internal_strcmp(SuppressionTypeString(SuppressionSignal),
>> "signal"));
>> CHECK(!internal_strcmp(SuppressionTypeString(SuppressionLeak),
>> "leak"));
>> CHECK(!internal_strcmp(SuppressionTypeString(SuppressionLib),
>> - "called_from_lib"));
>> + "called_from_lib"));
>> CHECK(
>> !internal_strcmp(SuppressionTypeString(SuppressionDeadlock),
>> "deadlock"));
>> + CHECK(!internal_strcmp(SuppressionTypeString(SuppressionVptrCheck),
>> + "vptr_check"));
>> // Ensure this test is up-to-date when suppression types are added.
>> - CHECK_EQ(SuppressionTypeCount, 8);
>> + CHECK_EQ(9, SuppressionTypeCount);
>> }
>>
>> class SuppressionContextTest : public ::testing::Test {
>>
>> Modified: compiler-rt/trunk/lib/ubsan/ubsan_diag.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_diag.cc?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/ubsan/ubsan_diag.cc (original)
>> +++ compiler-rt/trunk/lib/ubsan/ubsan_diag.cc Mon Aug 4 20:24:22 2014
>> @@ -312,3 +312,12 @@ ScopedReport::~ScopedReport() {
>> if (DieAfterReport)
>> Die();
>> }
>> +
>> +bool __ubsan::MatchSuppression(const char *Str, SuppressionType Type) {
>> + Suppression *s;
>> + // If .preinit_array is not used, it is possible that the UBSan
>> runtime is not
>> + // initialized.
>> + if (!SANITIZER_CAN_USE_PREINIT_ARRAY)
>> + InitIfNecessary();
>> + return SuppressionContext::Get()->Match(Str, Type, &s);
>> +}
>>
>> Modified: compiler-rt/trunk/lib/ubsan/ubsan_diag.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_diag.h?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/ubsan/ubsan_diag.h (original)
>> +++ compiler-rt/trunk/lib/ubsan/ubsan_diag.h Mon Aug 4 20:24:22 2014
>> @@ -15,6 +15,7 @@
>>
>> #include "ubsan_value.h"
>> #include "sanitizer_common/sanitizer_stacktrace.h"
>> +#include "sanitizer_common/sanitizer_suppressions.h"
>>
>> namespace __ubsan {
>>
>> @@ -218,6 +219,8 @@ public:
>> ~ScopedReport();
>> };
>>
>> +bool MatchSuppression(const char *Str, SuppressionType Type);
>> +
>> } // namespace __ubsan
>>
>> #endif // UBSAN_DIAG_H
>>
>> Modified: compiler-rt/trunk/lib/ubsan/ubsan_handlers_cxx.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_handlers_cxx.cc?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/ubsan/ubsan_handlers_cxx.cc (original)
>> +++ compiler-rt/trunk/lib/ubsan/ubsan_handlers_cxx.cc Mon Aug 4 20:24:22
>> 2014
>> @@ -18,6 +18,7 @@
>> #include "ubsan_type_hash.h"
>>
>> #include "sanitizer_common/sanitizer_common.h"
>> +#include "sanitizer_common/sanitizer_suppressions.h"
>>
>> using namespace __sanitizer;
>> using namespace __ubsan;
>> @@ -33,6 +34,12 @@ static void HandleDynamicTypeCacheMiss(
>> // Just a cache miss. The type matches after all.
>> return;
>>
>> + // Check if error report should be suppressed.
>> + DynamicTypeInfo DTI = getDynamicTypeInfo((void*)Pointer);
>> + if (DTI.isValid() &&
>> + MatchSuppression(DTI.getMostDerivedTypeName(),
>> SuppressionVptrCheck))
>> + return;
>> +
>> SourceLocation Loc = Data->Loc.acquire();
>> if (Loc.isDisabled())
>> return;
>> @@ -44,23 +51,23 @@ static void HandleDynamicTypeCacheMiss(
>> << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer <<
>> Data->Type;
>>
>> // If possible, say what type it actually points to.
>> - DynamicTypeInfo DTI = getDynamicTypeInfo((void*)Pointer);
>> if (!DTI.isValid())
>> Diag(Pointer, DL_Note, "object has invalid vptr")
>> - << MangledName(DTI.getMostDerivedTypeName())
>> - << Range(Pointer, Pointer + sizeof(uptr), "invalid vptr");
>> + << MangledName(DTI.getMostDerivedTypeName())
>> + << Range(Pointer, Pointer + sizeof(uptr), "invalid vptr");
>> else if (!DTI.getOffset())
>> Diag(Pointer, DL_Note, "object is of type %0")
>> - << MangledName(DTI.getMostDerivedTypeName())
>> - << Range(Pointer, Pointer + sizeof(uptr), "vptr for %0");
>> + << MangledName(DTI.getMostDerivedTypeName())
>> + << Range(Pointer, Pointer + sizeof(uptr), "vptr for %0");
>> else
>> // FIXME: Find the type at the specified offset, and include that
>> // in the note.
>> Diag(Pointer - DTI.getOffset(), DL_Note,
>> "object is base class subobject at offset %0 within object of
>> type %1")
>> - << DTI.getOffset() << MangledName(DTI.getMostDerivedTypeName())
>> - << MangledName(DTI.getSubobjectTypeName())
>> - << Range(Pointer, Pointer + sizeof(uptr), "vptr for %2 base class
>> of %1");
>> + << DTI.getOffset() << MangledName(DTI.getMostDerivedTypeName())
>> + << MangledName(DTI.getSubobjectTypeName())
>> + << Range(Pointer, Pointer + sizeof(uptr),
>> + "vptr for %2 base class of %1");
>>
>> MaybePrintStackTrace(pc, bp);
>> }
>>
>> Modified: compiler-rt/trunk/lib/ubsan/ubsan_init.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_init.cc?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/ubsan/ubsan_init.cc (original)
>> +++ compiler-rt/trunk/lib/ubsan/ubsan_init.cc Mon Aug 4 20:24:22 2014
>> @@ -16,6 +16,7 @@
>> #include "sanitizer_common/sanitizer_common.h"
>> #include "sanitizer_common/sanitizer_libc.h"
>> #include "sanitizer_common/sanitizer_mutex.h"
>> +#include "sanitizer_common/sanitizer_suppressions.h"
>> #include "sanitizer_common/sanitizer_symbolizer.h"
>>
>> using namespace __ubsan;
>> @@ -42,6 +43,7 @@ void __ubsan::InitIfNecessary() {
>> }
>> // Initialize UBSan-specific flags.
>> InitializeFlags();
>> + SuppressionContext::InitIfNecessary();
>> ubsan_inited = true;
>> }
>>
>>
>> Modified: compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr.cpp?rev=214833&r1=214832&r2=214833&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr.cpp (original)
>> +++ compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr.cpp Mon Aug 4
>> 20:24:22 2014
>> @@ -11,6 +11,19 @@
>> // RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t oU 2>&1 | FileCheck %s
>> --check-prefix=CHECK-OFFSET --strict-whitespace
>> // RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t m0 2>&1 | FileCheck %s
>> --check-prefix=CHECK-NULL-MEMBER --strict-whitespace
>>
>> +// RUN: %clangxx -fsanitize=vptr -fno-sanitize-recover -g %s -O3 -o %t
>> +// RUN: (echo "vptr_check:S"; echo "vptr_check:T"; echo "vptr_check:U")
>> > %t.supp
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t mS 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t fS 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t cS 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t mV 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t fV 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t cV 2>&1
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.supp"
>> UBSAN_OPTIONS=suppressions=%t.supp %run %t oU 2>&1
>> +
>> +// RUN: echo "vptr_check:S" > %t.loc-supp
>> +// RUN: ASAN_OPTIONS="$ASAN_OPTIONS suppressions=%t.loc-supp"
>> UBSAN_OPTIONS=suppressions=%t.loc-supp not %run %t x- 2>&1 | FileCheck %s
>> --check-prefix=CHECK-LOC-SUPPRESS
>>
>
> This test doesn't do "export ASAN_OPTIONS=...", so using $ASAN_OPTIONS in
> RUN: lines breaks when test runner checks for unset shell variables. I've
> fixed this in r214855.
>
>
>> +
>> // FIXME: This test produces linker errors on Darwin.
>> // XFAIL: darwin
>>
>> @@ -31,6 +44,8 @@ struct T : S {
>>
>> struct U : S, T { virtual int v() { return 2; } };
>>
>> +struct V : S {};
>> +
>> // Make p global so that lsan does not complain.
>> T *p = 0;
>>
>> @@ -84,6 +99,19 @@ int access_p(T *p, char type) {
>> {T &r = *p;}
>> break;
>>
>> + case 'x':
>> + for (int i = 0; i < 2; i++) {
>> + // Check that the first iteration ("S") succeeds, while the second
>> ("V") fails.
>> + p = reinterpret_cast<T*>((i == 0) ? new S : new V);
>> + // CHECK-LOC-SUPPRESS: vptr.cpp:[[@LINE+5]]:7: runtime error:
>> member call on address [[PTR:0x[0-9a-f]*]] which does not point to an
>> object of type 'T'
>> + // CHECK-LOC-SUPPRESS-NEXT: [[PTR]]: note: object is of type 'V'
>> + // CHECK-LOC-SUPPRESS-NEXT: {{^ .. .. .. .. .. .. .. .. .. .. ..
>> .. }}
>> + // CHECK-LOC-SUPPRESS-NEXT: {{^
>> \^~~~~~~~~~~(~~~~~~~~~~~~)? *$}}
>> + // CHECK-LOC-SUPPRESS-NEXT: {{^ vptr for 'V'}}
>> + p->g();
>> + }
>> + return 0;
>> +
>> case 'm':
>> // CHECK-MEMBER: vptr.cpp:[[@LINE+6]]:15: runtime error: member
>> access within address [[PTR:0x[0-9a-f]*]] which does not point to an object
>> of type 'T'
>> // CHECK-MEMBER-NEXT: [[PTR]]: note: object is of type
>> [[DYN_TYPE:'S'|'U']]
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
--
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140805/a15a7a9e/attachment.html>
More information about the llvm-commits
mailing list