diff options
author | Vedant Kumar <vsk@apple.com> | 2017-02-17 02:03:51 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2017-02-17 02:03:51 +0000 |
commit | 55875b99557d30e4aa75788ca8e7dd3089313580 (patch) | |
tree | 9e158dcd01872319566bdf01d08d30444f41bd36 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | f5dadfa73de4ee172b5ffc51bd8f6671096b5a5d (diff) | |
download | bcm5719-llvm-55875b99557d30e4aa75788ca8e7dd3089313580.tar.gz bcm5719-llvm-55875b99557d30e4aa75788ca8e7dd3089313580.zip |
Retry: [ubsan] Reduce null checking of C++ object pointers (PR27581)
This patch teaches ubsan to insert exactly one null check for the 'this'
pointer per method/lambda.
Previously, given a load of a member variable from an instance method
('this->x'), ubsan would insert a null check for 'this', and another
null check for '&this->x', before allowing the load to occur.
Similarly, given a call to a method from another method bound to the
same instance ('this->foo()'), ubsan would a redundant null check for
'this'. There is also a redundant null check in the case where the
object pointer is a reference ('Ref.foo()').
This patch teaches ubsan to remove the redundant null checks identified
above.
Testing: check-clang and check-ubsan. I also compiled X86FastISel.cpp
with -fsanitize=null using patched/unpatched clangs based on r293572.
Here are the number of null checks emitted:
-------------------------------------
| Setup | # of null checks |
-------------------------------------
| unpatched, -O0 | 21767 |
| patched, -O0 | 10758 |
-------------------------------------
Changes since the initial commit: don't rely on IRGen of C labels in the
test.
Differential Revision: https://reviews.llvm.org/D29530
llvm-svn: 295401
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 00d5b5fe688..ddcdc030d94 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -948,6 +948,11 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, // fast register allocator would be happier... CXXThisValue = CXXABIThisValue; } + + // Sanitize the 'this' pointer once per function, if it's available. + if (CXXThisValue) + EmitTypeCheck(TCK_MemberAccess, Loc, CXXThisValue, + MD->getThisType(getContext())); } // If any of the arguments have a variably modified type, make sure to |