From: Kostya Serebryany Date: Fri, 31 Oct 2014 19:01:02 +0000 (+0000) Subject: ignore -mconstructor-aliases when adding field paddings for asan X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=083a9aac147fbf437d4f9079d6dd7acfbbdc71b5;p=clang ignore -mconstructor-aliases when adding field paddings for asan Summary: When we are adding field paddings for asan even an empty dtor has to remain in the code, so we ignore -mconstructor-aliases if the paddings are going to be added. Test Plan: added a test Reviewers: rsmith, rnk, rafael Reviewed By: rafael Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D6038 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220986 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index a590afae0b..e467891d10 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -46,6 +46,11 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) { const CXXRecordDecl *Class = D->getParent(); + // We are going to instrument this destructor, so give up even if it is + // currently empty. + if (Class->mayInsertExtraPadding()) + return true; + // If we need to manipulate a VTT parameter, give up. if (Class->getNumVBases()) { // Extra Credit: passing extra parameters is perfectly safe diff --git a/test/CodeGen/sanitize-address-field-padding.cpp b/test/CodeGen/sanitize-address-field-padding.cpp index 5f049bb005..0d09a133d4 100644 --- a/test/CodeGen/sanitize-address-field-padding.cpp +++ b/test/CodeGen/sanitize-address-field-padding.cpp @@ -2,6 +2,7 @@ // RUN: echo 'type:SomeNamespace::BlacklistedByName=field-padding' > %t.type.blacklist // RUN: echo 'src:*sanitize-address-field-padding.cpp=field-padding' > %t.file.blacklist // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsanitize=address -fsanitize-address-field-padding=1 -fsanitize-blacklist=%t.type.blacklist -Rsanitize-address -emit-llvm -o - %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsanitize=address -fsanitize-address-field-padding=1 -fsanitize-blacklist=%t.type.blacklist -Rsanitize-address -emit-llvm -o - %s -O1 -mconstructor-aliases 2>&1 | FileCheck %s --check-prefix=WITH_CTOR_ALIASES // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsanitize=address -fsanitize-address-field-padding=1 -fsanitize-blacklist=%t.file.blacklist -Rsanitize-address -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefix=FILE_BLACKLIST // RUN: %clang_cc1 -fsanitize=address -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefix=NO_PADDING // REQUIRES: shell @@ -193,3 +194,27 @@ ExternCStruct extern_C_struct; // CHECK-NOT: __asan_poison_intra_object_redzone // CHECK: ret void // + +struct WithVirtualDtor { + virtual ~WithVirtualDtor(); + int x, y; +}; +struct InheritsFrom_WithVirtualDtor: WithVirtualDtor { + int a, b; + InheritsFrom_WithVirtualDtor() {} + ~InheritsFrom_WithVirtualDtor() {} +}; + +void Create_InheritsFrom_WithVirtualDtor() { + InheritsFrom_WithVirtualDtor x; +} + + +// Make sure the dtor of InheritsFrom_WithVirtualDtor remains in the code, +// i.e. we ignore -mconstructor-aliases when field paddings are added +// because the paddings in InheritsFrom_WithVirtualDtor needs to be unpoisoned +// in the dtor. +// WITH_CTOR_ALIASES-LABEL: define void @_Z35Create_InheritsFrom_WithVirtualDtor +// WITH_CTOR_ALIASES-NOT: call void @_ZN15WithVirtualDtorD2Ev +// WITH_CTOR_ALIASES: call void @_ZN28InheritsFrom_WithVirtualDtorD2Ev +// WITH_CTOR_ALIASES: ret void