Skip to content

Commit 9553514

Browse files
authored
[NFCI][ubsan] Precommit tests for -fsanitize-annotate-debug-info (#141814)
These tests will track progress on extending #139809 from CFI to more UBSan checks.
1 parent 3a0205a commit 9553514

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang_cc1 -O2 -emit-llvm -triple x86_64 -std=c17 -fsanitize=function %s -o - \
3+
// RUN: -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -debug-info-kind=limited \
4+
// RUN: -fsanitize-annotate-debug-info=function \
5+
// RUN: | FileCheck %s
6+
7+
// CHECK-LABEL: define dso_local void @call_no_prototype(
8+
// CHECK-SAME: ptr noundef readonly captures(none) [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !dbg [[DBG5:![0-9]+]] !func_sanitize [[META14:![0-9]+]] {
9+
// CHECK-NEXT: [[ENTRY:.*:]]
10+
// CHECK-NEXT: #dbg_value(ptr [[F]], [[META13:![0-9]+]], !DIExpression(), [[META15:![0-9]+]])
11+
// CHECK-NEXT: tail call void (...) [[F]]() #[[ATTR2:[0-9]+]], !dbg [[DBG16:![0-9]+]]
12+
// CHECK-NEXT: ret void, !dbg [[DBG17:![0-9]+]]
13+
//
14+
void call_no_prototype(void (*f)()) { f(); }
15+
16+
// CHECK-LABEL: define dso_local void @call_prototype(
17+
// CHECK-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg [[DBG18:![0-9]+]] !func_sanitize [[META26:![0-9]+]] {
18+
// CHECK-NEXT: [[ENTRY:.*:]]
19+
// CHECK-NEXT: #dbg_value(ptr [[F]], [[META25:![0-9]+]], !DIExpression(), [[META27:![0-9]+]])
20+
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[F]], i64 -8, !dbg [[DBG28:![0-9]+]]
21+
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG28]], !nosanitize [[META29:![0-9]+]]
22+
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], -1056584962, !dbg [[DBG28]], !nosanitize [[META29]]
23+
// CHECK-NEXT: br i1 [[TMP2]], label %[[TYPECHECK:.*]], label %[[CONT1:.*]], !dbg [[DBG28]], !nosanitize [[META29]]
24+
// CHECK: [[TYPECHECK]]:
25+
// CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[F]], i64 -4, !dbg [[DBG28]]
26+
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 8, !dbg [[DBG28]], !nosanitize [[META29]]
27+
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[TMP4]], 905068220, !dbg [[DBG28]], !nosanitize [[META29]]
28+
// CHECK-NEXT: br i1 [[TMP5]], label %[[CONT1]], label %[[HANDLER_FUNCTION_TYPE_MISMATCH:.*]], !dbg [[DBG28]], !prof [[PROF30:![0-9]+]], !nosanitize [[META29]]
29+
// CHECK: [[HANDLER_FUNCTION_TYPE_MISMATCH]]:
30+
// CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[F]] to i64, !dbg [[DBG28]], !nosanitize [[META29]]
31+
// CHECK-NEXT: tail call void @__ubsan_handle_function_type_mismatch_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP6]]) #[[ATTR3:[0-9]+]], !dbg [[DBG28]], !nosanitize [[META29]]
32+
// CHECK-NEXT: unreachable, !dbg [[DBG28]], !nosanitize [[META29]]
33+
// CHECK: [[CONT1]]:
34+
// CHECK-NEXT: tail call void [[F]]() #[[ATTR2]], !dbg [[DBG28]]
35+
// CHECK-NEXT: ret void, !dbg [[DBG31:![0-9]+]]
36+
//
37+
void call_prototype(void (*f)(void)) { f(); }
38+
//.
39+
// CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
40+
// CHECK: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})
41+
// CHECK: [[DBG5]] = distinct !DISubprogram(name: "call_no_prototype", scope: [[META6:![0-9]+]], file: [[META6]], line: 14, type: [[META7:![0-9]+]], scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]])
42+
// CHECK: [[META6]] = !DIFile(filename: "{{.*}}ubsan-function-debuginfo.c", directory: {{.*}})
43+
// CHECK: [[META7]] = !DISubroutineType(types: [[META8:![0-9]+]])
44+
// CHECK: [[META8]] = !{null, [[META9:![0-9]+]]}
45+
// CHECK: [[META9]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META10:![0-9]+]], size: 64)
46+
// CHECK: [[META10]] = !DISubroutineType(types: [[META11:![0-9]+]])
47+
// CHECK: [[META11]] = !{null, null}
48+
// CHECK: [[META12]] = !{[[META13]]}
49+
// CHECK: [[META13]] = !DILocalVariable(name: "f", arg: 1, scope: [[DBG5]], file: [[META6]], line: 14, type: [[META9]])
50+
// CHECK: [[META14]] = !{i32 -1056584962, i32 187769638}
51+
// CHECK: [[META15]] = !DILocation(line: 0, scope: [[DBG5]])
52+
// CHECK: [[DBG16]] = !DILocation(line: 14, column: 39, scope: [[DBG5]])
53+
// CHECK: [[DBG17]] = !DILocation(line: 14, column: 44, scope: [[DBG5]])
54+
// CHECK: [[DBG18]] = distinct !DISubprogram(name: "call_prototype", scope: [[META6]], file: [[META6]], line: 37, type: [[META19:![0-9]+]], scopeLine: 37, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META24:![0-9]+]])
55+
// CHECK: [[META19]] = !DISubroutineType(types: [[META20:![0-9]+]])
56+
// CHECK: [[META20]] = !{null, [[META21:![0-9]+]]}
57+
// CHECK: [[META21]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META22:![0-9]+]], size: 64)
58+
// CHECK: [[META22]] = !DISubroutineType(types: [[META23:![0-9]+]])
59+
// CHECK: [[META23]] = !{null}
60+
// CHECK: [[META24]] = !{[[META25]]}
61+
// CHECK: [[META25]] = !DILocalVariable(name: "f", arg: 1, scope: [[DBG18]], file: [[META6]], line: 37, type: [[META21]])
62+
// CHECK: [[META26]] = !{i32 -1056584962, i32 -747727454}
63+
// CHECK: [[META27]] = !DILocation(line: 0, scope: [[DBG18]])
64+
// CHECK: [[DBG28]] = !DILocation(line: 37, column: 40, scope: [[DBG18]])
65+
// CHECK: [[META29]] = !{}
66+
// CHECK: [[PROF30]] = !{!"branch_weights", i32 1048575, i32 1}
67+
// CHECK: [[DBG31]] = !DILocation(line: 37, column: 45, scope: [[DBG18]])
68+
//.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang_cc1 -O2 -triple x86_64-linux-gnu -emit-llvm -o - %s \
3+
// RUN: -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -debug-info-kind=limited \
4+
// RUN: -fsanitize-annotate-debug-info=signed-integer-overflow \
5+
// RUN: -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CHECKS
6+
7+
// RUN: %clang_cc1 -O2 -triple x86_64-linux-gnu -emit-llvm -o - %s \
8+
// RUN: -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -debug-info-kind=limited \
9+
// RUN: -fsanitize-annotate-debug-info=signed-integer-overflow \
10+
// RUN: -fsanitize=unsigned-integer-overflow | FileCheck %s --check-prefix=CHECKU
11+
12+
unsigned short si, sj, sk;
13+
14+
// CHECKS-LABEL: define dso_local void @testshortmul(
15+
// CHECKS-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] !dbg [[DBG13:![0-9]+]] {
16+
// CHECKS-NEXT: [[ENTRY:.*:]]
17+
// CHECKS-NEXT: [[TMP0:%.*]] = load i16, ptr @sj, align 2, !dbg [[DBG16:![0-9]+]], !tbaa [[TBAA17:![0-9]+]]
18+
// CHECKS-NEXT: [[CONV:%.*]] = zext i16 [[TMP0]] to i32, !dbg [[DBG16]]
19+
// CHECKS-NEXT: [[TMP1:%.*]] = load i16, ptr @sk, align 2, !dbg [[DBG21:![0-9]+]], !tbaa [[TBAA17]]
20+
// CHECKS-NEXT: [[CONV1:%.*]] = zext i16 [[TMP1]] to i32, !dbg [[DBG21]]
21+
// CHECKS-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[CONV]], i32 [[CONV1]]), !dbg [[DBG22:![0-9]+]], !nosanitize [[META23:![0-9]+]]
22+
// CHECKS-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !dbg [[DBG22]], !nosanitize [[META23]]
23+
// CHECKS-NEXT: br i1 [[TMP3]], label %[[HANDLER_MUL_OVERFLOW:.*]], label %[[CONT:.*]], !dbg [[DBG22]], !prof [[PROF24:![0-9]+]], !nosanitize [[META23]]
24+
// CHECKS: [[HANDLER_MUL_OVERFLOW]]:
25+
// CHECKS-NEXT: [[TMP4:%.*]] = zext i16 [[TMP0]] to i64, !dbg [[DBG22]]
26+
// CHECKS-NEXT: [[TMP5:%.*]] = zext i16 [[TMP1]] to i64, !dbg [[DBG22]]
27+
// CHECKS-NEXT: tail call void @__ubsan_handle_mul_overflow_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP4]], i64 [[TMP5]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22]], !nosanitize [[META23]]
28+
// CHECKS-NEXT: unreachable, !dbg [[DBG22]], !nosanitize [[META23]]
29+
// CHECKS: [[CONT]]:
30+
// CHECKS-NEXT: [[TMP6:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !dbg [[DBG22]], !nosanitize [[META23]]
31+
// CHECKS-NEXT: [[CONV2:%.*]] = trunc i32 [[TMP6]] to i16, !dbg [[DBG16]]
32+
// CHECKS-NEXT: store i16 [[CONV2]], ptr @si, align 2, !dbg [[DBG25:![0-9]+]], !tbaa [[TBAA17]]
33+
// CHECKS-NEXT: ret void, !dbg [[DBG26:![0-9]+]]
34+
//
35+
// CHECKU-LABEL: define dso_local void @testshortmul(
36+
// CHECKU-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] !dbg [[DBG13:![0-9]+]] {
37+
// CHECKU-NEXT: [[ENTRY:.*:]]
38+
// CHECKU-NEXT: [[TMP0:%.*]] = load i16, ptr @sj, align 2, !dbg [[DBG16:![0-9]+]], !tbaa [[TBAA17:![0-9]+]]
39+
// CHECKU-NEXT: [[TMP1:%.*]] = load i16, ptr @sk, align 2, !dbg [[DBG21:![0-9]+]], !tbaa [[TBAA17]]
40+
// CHECKU-NEXT: [[MUL:%.*]] = mul i16 [[TMP1]], [[TMP0]], !dbg [[DBG22:![0-9]+]]
41+
// CHECKU-NEXT: store i16 [[MUL]], ptr @si, align 2, !dbg [[DBG23:![0-9]+]], !tbaa [[TBAA17]]
42+
// CHECKU-NEXT: ret void, !dbg [[DBG24:![0-9]+]]
43+
//
44+
void testshortmul(void) {
45+
46+
//
47+
si = sj * sk;
48+
}
49+
//.
50+
// CHECKS: [[META0:![0-9]+]] = !DIGlobalVariableExpression(var: [[META1:![0-9]+]], expr: !DIExpression())
51+
// CHECKS: [[META1]] = distinct !DIGlobalVariable(name: "sj", scope: [[META2:![0-9]+]], file: [[META7:![0-9]+]], line: 12, type: [[META8:![0-9]+]], isLocal: false, isDefinition: true)
52+
// CHECKS: [[META2]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META3:![0-9]+]], isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: [[META4:![0-9]+]], splitDebugInlining: false, nameTableKind: None)
53+
// CHECKS: [[META3]] = !DIFile(filename: "<stdin>", directory: {{.*}})
54+
// CHECKS: [[META4]] = !{[[META5:![0-9]+]], [[META0]], [[META9:![0-9]+]]}
55+
// CHECKS: [[META5]] = !DIGlobalVariableExpression(var: [[META6:![0-9]+]], expr: !DIExpression())
56+
// CHECKS: [[META6]] = distinct !DIGlobalVariable(name: "si", scope: [[META2]], file: [[META7]], line: 12, type: [[META8]], isLocal: false, isDefinition: true)
57+
// CHECKS: [[META7]] = !DIFile(filename: "{{.*}}unsigned-promotion-debuginfo.c", directory: {{.*}})
58+
// CHECKS: [[META8]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
59+
// CHECKS: [[META9]] = !DIGlobalVariableExpression(var: [[META10:![0-9]+]], expr: !DIExpression())
60+
// CHECKS: [[META10]] = distinct !DIGlobalVariable(name: "sk", scope: [[META2]], file: [[META7]], line: 12, type: [[META8]], isLocal: false, isDefinition: true)
61+
// CHECKS: [[DBG13]] = distinct !DISubprogram(name: "testshortmul", scope: [[META7]], file: [[META7]], line: 44, type: [[META14:![0-9]+]], scopeLine: 44, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META2]])
62+
// CHECKS: [[META14]] = !DISubroutineType(types: [[META15:![0-9]+]])
63+
// CHECKS: [[META15]] = !{null}
64+
// CHECKS: [[DBG16]] = !DILocation(line: 47, column: 8, scope: [[DBG13]])
65+
// CHECKS: [[TBAA17]] = !{[[META18:![0-9]+]], [[META18]], i64 0}
66+
// CHECKS: [[META18]] = !{!"short", [[META19:![0-9]+]], i64 0}
67+
// CHECKS: [[META19]] = !{!"omnipotent char", [[META20:![0-9]+]], i64 0}
68+
// CHECKS: [[META20]] = !{!"Simple C/C++ TBAA"}
69+
// CHECKS: [[DBG21]] = !DILocation(line: 47, column: 13, scope: [[DBG13]])
70+
// CHECKS: [[DBG22]] = !DILocation(line: 47, column: 11, scope: [[DBG13]])
71+
// CHECKS: [[META23]] = !{}
72+
// CHECKS: [[PROF24]] = !{!"branch_weights", i32 1, i32 1048575}
73+
// CHECKS: [[DBG25]] = !DILocation(line: 47, column: 6, scope: [[DBG13]])
74+
// CHECKS: [[DBG26]] = !DILocation(line: 48, column: 1, scope: [[DBG13]])
75+
//.
76+
// CHECKU: [[META0:![0-9]+]] = !DIGlobalVariableExpression(var: [[META1:![0-9]+]], expr: !DIExpression())
77+
// CHECKU: [[META1]] = distinct !DIGlobalVariable(name: "sj", scope: [[META2:![0-9]+]], file: [[META7:![0-9]+]], line: 12, type: [[META8:![0-9]+]], isLocal: false, isDefinition: true)
78+
// CHECKU: [[META2]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META3:![0-9]+]], isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: [[META4:![0-9]+]], splitDebugInlining: false, nameTableKind: None)
79+
// CHECKU: [[META3]] = !DIFile(filename: "<stdin>", directory: {{.*}})
80+
// CHECKU: [[META4]] = !{[[META5:![0-9]+]], [[META0]], [[META9:![0-9]+]]}
81+
// CHECKU: [[META5]] = !DIGlobalVariableExpression(var: [[META6:![0-9]+]], expr: !DIExpression())
82+
// CHECKU: [[META6]] = distinct !DIGlobalVariable(name: "si", scope: [[META2]], file: [[META7]], line: 12, type: [[META8]], isLocal: false, isDefinition: true)
83+
// CHECKU: [[META7]] = !DIFile(filename: "{{.*}}unsigned-promotion-debuginfo.c", directory: {{.*}})
84+
// CHECKU: [[META8]] = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
85+
// CHECKU: [[META9]] = !DIGlobalVariableExpression(var: [[META10:![0-9]+]], expr: !DIExpression())
86+
// CHECKU: [[META10]] = distinct !DIGlobalVariable(name: "sk", scope: [[META2]], file: [[META7]], line: 12, type: [[META8]], isLocal: false, isDefinition: true)
87+
// CHECKU: [[DBG13]] = distinct !DISubprogram(name: "testshortmul", scope: [[META7]], file: [[META7]], line: 44, type: [[META14:![0-9]+]], scopeLine: 44, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META2]])
88+
// CHECKU: [[META14]] = !DISubroutineType(types: [[META15:![0-9]+]])
89+
// CHECKU: [[META15]] = !{null}
90+
// CHECKU: [[DBG16]] = !DILocation(line: 47, column: 8, scope: [[DBG13]])
91+
// CHECKU: [[TBAA17]] = !{[[META18:![0-9]+]], [[META18]], i64 0}
92+
// CHECKU: [[META18]] = !{!"short", [[META19:![0-9]+]], i64 0}
93+
// CHECKU: [[META19]] = !{!"omnipotent char", [[META20:![0-9]+]], i64 0}
94+
// CHECKU: [[META20]] = !{!"Simple C/C++ TBAA"}
95+
// CHECKU: [[DBG21]] = !DILocation(line: 47, column: 13, scope: [[DBG13]])
96+
// CHECKU: [[DBG22]] = !DILocation(line: 47, column: 11, scope: [[DBG13]])
97+
// CHECKU: [[DBG23]] = !DILocation(line: 47, column: 6, scope: [[DBG13]])
98+
// CHECKU: [[DBG24]] = !DILocation(line: 48, column: 1, scope: [[DBG13]])
99+
//.

0 commit comments

Comments
 (0)