Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
CFI: blacklist STL allocate() from unrelated-casts
Summary: Previously, STL allocators were blacklisted in compiler_rt's cfi_blacklist.txt because they mandated a cast from void* to T* before object initialization completed. This change moves that logic into the front end because C++ name mangling supports a substitution compression mechanism for symbols that makes it difficult to blacklist the mangled symbol for allocate() using a regular expression. Motivated by crbug.com/751385. Reviewers: pcc, kcc Reviewed By: pcc Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D36294 llvm-svn: 310097
- Loading branch information
Showing
2 changed files
with
64 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// STL allocators should not have unrelated-cast tests applied | ||
// RUN: %clang_cc1 -flto -fvisibility hidden -fsanitize=cfi-unrelated-cast -emit-llvm -o - %s | FileCheck %s | ||
|
||
#include <stddef.h> | ||
|
||
template<class T> | ||
class myalloc { | ||
public: | ||
// CHECK: define{{.*}}allocateE{{.}} | ||
// CHECK-NOT: llvm.type.test | ||
T *allocate(size_t sz) { | ||
return (T*)::operator new(sz); | ||
} | ||
|
||
// CHECK: define{{.*}}allocateE{{.}}PKv | ||
// CHECK-NOT: llvm.type.test | ||
T *allocate(size_t sz, const void *ptr) { | ||
return (T*)::operator new(sz); | ||
} | ||
|
||
// CHECK: define{{.*}}differentName | ||
// CHECK: llvm.type.test | ||
T *differentName(size_t sz, const void *ptr) { | ||
return (T*)::operator new(sz); | ||
} | ||
}; | ||
|
||
class C1 { | ||
virtual void f() {} | ||
}; | ||
|
||
C1 *f1() { | ||
myalloc<C1> allocator; | ||
(void)allocator.allocate(16); | ||
(void)allocator.allocate(16, 0); | ||
(void)allocator.differentName(16, 0); | ||
} |