211 lines · plain
1; Regular stack poisoning.2; RUN: opt < %s -passes=asan -asan-use-after-scope=0 -S | FileCheck --check-prefixes=CHECK,ENTRY,EXIT %s3 4; Stack poisoning with stack-use-after-scope.5; RUN: opt < %s -passes=asan -asan-use-after-scope=1 -S | FileCheck --check-prefixes=CHECK,ENTRY-UAS,EXIT-UAS %s6 7target datalayout = "e-i64:64-f80:128-s:64-n8:16:32:64-S128"8target triple = "x86_64-unknown-linux-gnu"9 10declare void @Foo(ptr)11 12define void @Bar() uwtable sanitize_address {13entry:14 %x = alloca [650 x i8], align 1615 %xx = getelementptr inbounds [650 x i8], ptr %x, i64 0, i64 016 17 %y = alloca [13 x i8], align 118 %yy = getelementptr inbounds [13 x i8], ptr %y, i64 0, i64 019 20 %z = alloca [40 x i8], align 121 %zz = getelementptr inbounds [40 x i8], ptr %z, i64 0, i64 022 23 ; CHECK: [[SHADOW_BASE:%[0-9]+]] = add i64 %{{[0-9]+}}, 214745088024 25 ; F1F1F1F126 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 027 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr28 ; ENTRY-NEXT: store i32 -235802127, ptr [[PTR]], align 129 30 ; 02F2F2F2F2F2F2F231 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 8532 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr33 ; ENTRY-NEXT: store i64 -940422246894996990, ptr [[PTR]], align 134 35 ; F2F2F2F2F2F2F2F236 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 9337 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr38 ; ENTRY-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 139 40 ; F20005F2F200000041 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 10142 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr43 ; ENTRY-NEXT: store i64 1043442499826, ptr [[PTR]], align 144 45 ; F3F3F3F346 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 11147 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr48 ; ENTRY-NEXT: store i32 -202116109, ptr [[PTR]], align 149 50 ; F351 ; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 11552 ; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr53 ; ENTRY-NEXT: store i8 -13, ptr [[PTR]], align 154 55 ; F1F1F1F156 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 057 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr58 ; ENTRY-UAS-NEXT: store i32 -235802127, ptr [[PTR]], align 159 60 ; F8F8F8...61 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 462 ; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)63 64 ; F2F2F2F2F2F2F2F265 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 8666 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr67 ; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 168 69 ; F2F2F2F2F2F2F2F270 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 9471 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr72 ; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 173 74 ; F8F8F2F2F8F8F8F875 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 10276 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr77 ; ENTRY-UAS-NEXT: store i64 -506381209967593224, ptr [[PTR]], align 178 79 ; F8F3F3F380 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 11081 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr82 ; ENTRY-UAS-NEXT: store i32 -202116104, ptr [[PTR]], align 183 84 ; F3F385 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 11486 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr87 ; ENTRY-UAS-NEXT: store i16 -3085, ptr [[PTR]], align 188 89 ; CHECK-LABEL: %xx = getelementptr inbounds90 ; CHECK-NEXT: %yy = getelementptr inbounds91 ; CHECK-NEXT: %zz = getelementptr inbounds92 93 94 call void @llvm.lifetime.start.p0(i64 650, ptr %xx)95 ; 0000...96 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 497 ; ENTRY-UAS-NEXT: call void @__asan_set_shadow_00(i64 [[OFFSET]], i64 81)98 ; 0299 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85100 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr101 ; ENTRY-UAS-NEXT: store i8 2, ptr [[PTR]], align 1102 103 call void @Foo(ptr %xx)104 ; CHECK-NEXT: call void @Foo(ptr %xx)105 106 call void @llvm.lifetime.end.p0(i64 650, ptr %xx)107 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4108 ; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)109 110 111 call void @llvm.lifetime.start.p0(i64 13, ptr %yy)112 ; 0005113 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102114 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr115 ; ENTRY-UAS-NEXT: store i16 1280, ptr [[PTR]], align 1116 117 call void @Foo(ptr %yy)118 ; CHECK-NEXT: call void @Foo(ptr %yy)119 120 call void @llvm.lifetime.end.p0(i64 13, ptr %yy)121 ; F8F8122 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102123 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr124 ; ENTRY-UAS-NEXT: store i16 -1800, ptr [[PTR]], align 1125 126 127 call void @llvm.lifetime.start.p0(i64 40, ptr %zz)128 ; 00000000129 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106130 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr131 ; ENTRY-UAS-NEXT: store i32 0, ptr [[PTR]], align 1132 ; 00133 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110134 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr135 ; ENTRY-UAS-NEXT: store i8 0, ptr [[PTR]], align 1136 137 call void @Foo(ptr %zz)138 ; CHECK-NEXT: call void @Foo(ptr %zz)139 140 call void @llvm.lifetime.end.p0(i64 40, ptr %zz)141 ; F8F8F8F8142 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106143 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr144 ; ENTRY-UAS-NEXT: store i32 -117901064, ptr [[PTR]], align 1145 ; F8146 ; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110147 ; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr148 ; ENTRY-UAS-NEXT: store i8 -8, ptr [[PTR]], align 1149 150 ; CHECK: {{^[0-9]+}}:151 152 ; CHECK-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0153 ; CHECK-NEXT: call void @__asan_set_shadow_f5(i64 [[OFFSET]], i64 128)154 155 ; CHECK-NOT: add i64 [[SHADOW_BASE]]156 157 ; CHECK: {{^[0-9]+}}:158 159 ; 00000000160 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0161 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr162 ; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1163 164 ; 0000000000000000165 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85166 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr167 ; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1168 169 ; 0000000000000000170 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 93171 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr172 ; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1173 174 ; 0000000000000000175 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 101176 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr177 ; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1178 179 ; 00000000180 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 111181 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr182 ; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1183 184 ; 00185 ; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 115186 ; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr187 ; EXIT-NEXT: store i8 0, ptr [[PTR]], align 1188 189 ; 0000...190 ; EXIT-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0191 ; EXIT-UAS-NEXT: call void @__asan_set_shadow_00(i64 [[OFFSET]], i64 116)192 193 ; CHECK-NOT: add i64 [[SHADOW_BASE]]194 195 ret void196 ; CHECK: {{^[0-9]+}}:197 ; CHECK: ret void198}199 200declare void @llvm.lifetime.start.p0(i64, ptr nocapture)201declare void @llvm.lifetime.end.p0(i64, ptr nocapture)202 203; CHECK-ON: declare void @__asan_set_shadow_00(i64, i64)204; CHECK-ON: declare void @__asan_set_shadow_f1(i64, i64)205; CHECK-ON: declare void @__asan_set_shadow_f2(i64, i64)206; CHECK-ON: declare void @__asan_set_shadow_f3(i64, i64)207; CHECK-ON: declare void @__asan_set_shadow_f5(i64, i64)208; CHECK-ON: declare void @__asan_set_shadow_f8(i64, i64)209 210; CHECK-OFF-NOT: declare void @__asan_set_shadow_211