Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ubsan] Diagnose invalid uses of builtins (clang)
On some targets, passing zero to the clz() or ctz() builtins has undefined behavior. I ran into this issue while debugging UB in __hash_table from libcxx: the bug I was seeing manifested itself differently under -O0 vs -Os, due to a UB call to clz() (see: libcxx/r304617). This patch introduces a check which can detect UB calls to builtins. llvm.org/PR26979 Differential Revision: https://reviews.llvm.org/D34590 llvm-svn: 309459
- Loading branch information
Showing
6 changed files
with
95 additions
and
16 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
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
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,44 @@ | ||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s | ||
// RUN: %clang_cc1 -triple arm64-none-linux-gnu -w -emit-llvm -o - %s -fsanitize=builtin | FileCheck %s --check-prefix=NOT-UB | ||
|
||
// NOT-UB-NOT: __ubsan_handle_invalid_builtin | ||
|
||
// CHECK: define void @check_ctz | ||
void check_ctz(int n) { | ||
// CHECK: [[NOT_ZERO:%.*]] = icmp ne i32 [[N:%.*]], 0, !nosanitize | ||
// CHECK-NEXT: br i1 [[NOT_ZERO]] | ||
// | ||
// Handler block: | ||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
// CHECK-NEXT: unreachable | ||
// | ||
// Continuation block: | ||
// CHECK: call i32 @llvm.cttz.i32(i32 [[N]], i1 true) | ||
__builtin_ctz(n); | ||
|
||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
__builtin_ctzl(n); | ||
|
||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
__builtin_ctzll(n); | ||
} | ||
|
||
// CHECK: define void @check_clz | ||
void check_clz(int n) { | ||
// CHECK: [[NOT_ZERO:%.*]] = icmp ne i32 [[N:%.*]], 0, !nosanitize | ||
// CHECK-NEXT: br i1 [[NOT_ZERO]] | ||
// | ||
// Handler block: | ||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
// CHECK-NEXT: unreachable | ||
// | ||
// Continuation block: | ||
// CHECK: call i32 @llvm.ctlz.i32(i32 [[N]], i1 true) | ||
__builtin_clz(n); | ||
|
||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
__builtin_clzl(n); | ||
|
||
// CHECK: call void @__ubsan_handle_invalid_builtin | ||
__builtin_clzll(n); | ||
} |
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