[PATCH] D93072: Fix PR35902: incorrect alignment used for ubsan check.
James Y Knight via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 10 15:10:32 PST 2020
jyknight created this revision.
jyknight added reviewers: rsmith, rnk.
jyknight requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
UBSan was using the complete-object align rather than nv alignment
when checking the "this" pointer of a method.
Furthermore, CGF.CXXABIThisAlignment was also being set incorrectly,
due to an incorrectly negated test. The latter doesn't appear to have
had any impact, due to it not really being used anywhere.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D93072
Files:
clang/lib/CodeGen/CGCXXABI.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/test/CodeGenCXX/catch-undef-behavior.cpp
Index: clang/test/CodeGenCXX/catch-undef-behavior.cpp
===================================================================
--- clang/test/CodeGenCXX/catch-undef-behavior.cpp
+++ clang/test/CodeGenCXX/catch-undef-behavior.cpp
@@ -430,8 +430,8 @@
// Note: C is laid out such that offsetof(C, B) + sizeof(B) extends outside
// the C object.
struct alignas(16) A { void *a1, *a2; };
- struct B : virtual A { void *b; };
- struct C : virtual A, virtual B {};
+ struct B : virtual A { void *b; void* g(); };
+ struct C : virtual A, virtual B { };
// CHECK-LABEL: define {{.*}} @_ZN15VBaseObjectSize1fERNS_1BE(
B &f(B &b) {
// Size check: check for nvsize(B) == 16 (do not require size(B) == 32)
@@ -443,6 +443,15 @@
// CHECK: and i64 [[PTRTOINT]], 7,
return b;
}
+
+ // CHECK-LABEL: define {{.*}} @_ZN15VBaseObjectSize1B1gEv(
+ void *B::g() {
+ // Ensure that the check on the "this" pointer also uses the proper
+ // alignment. We should be using nvalign(B) == 8, not 16.
+ // CHECK: [[PTRTOINT:%.+]] = ptrtoint {{.*}} to i64,
+ // CHECK: and i64 [[PTRTOINT]], 7
+ return nullptr;
+ }
}
namespace FunctionSanitizerVirtualCalls {
Index: clang/lib/CodeGen/CodeGenFunction.cpp
===================================================================
--- clang/lib/CodeGen/CodeGenFunction.cpp
+++ clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1137,11 +1137,9 @@
MD->getParent()->getLambdaCaptureDefault() == LCD_None)
SkippedChecks.set(SanitizerKind::Null, true);
- EmitTypeCheck(isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall
- : TCK_MemberCall,
- Loc, CXXABIThisValue, ThisTy,
- getContext().getTypeAlignInChars(ThisTy->getPointeeType()),
- SkippedChecks);
+ EmitTypeCheck(
+ isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall : TCK_MemberCall,
+ Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
}
}
Index: clang/lib/CodeGen/CGCXXABI.cpp
===================================================================
--- clang/lib/CodeGen/CGCXXABI.cpp
+++ clang/lib/CodeGen/CGCXXABI.cpp
@@ -136,7 +136,7 @@
auto &Layout = CGF.getContext().getASTRecordLayout(MD->getParent());
if (MD->getParent()->getNumVBases() == 0 || // avoid vcall in common case
MD->getParent()->hasAttr<FinalAttr>() ||
- !isThisCompleteObject(CGF.CurGD)) {
+ isThisCompleteObject(CGF.CurGD)) {
CGF.CXXABIThisAlignment = Layout.getAlignment();
} else {
CGF.CXXABIThisAlignment = Layout.getNonVirtualAlignment();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93072.311036.patch
Type: text/x-patch
Size: 2634 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201210/67622f5a/attachment.bin>
More information about the cfe-commits
mailing list