Skip to content

Commit 185e21a

Browse files
committed
[hwasan] Add hwasan-all-globals option
hwasan-globals does not instrument globals with custom sections, because existing code may use __start_/__stop_ symbols to iterate over globals in such a way which will cause hwasan assertions. Introduce new hwasan-all-globals option, which instruments all user-defined globals (but not those globals which are generated by the hwasan instrumentation itself), including those with custom sections.
1 parent ecf0cbd commit 185e21a

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,16 @@ static cl::opt<bool> ClGenerateTagsWithCalls(
160160
static cl::opt<bool> ClGlobals("hwasan-globals", cl::desc("Instrument globals"),
161161
cl::Hidden, cl::init(false));
162162

163+
static cl::opt<bool> ClAllGlobals(
164+
"hwasan-all-globals",
165+
cl::desc(
166+
"Instrument globals, even those within user-defined sections. Warning: "
167+
"This may break existing code which walks globals via linker-generated "
168+
"symbols, expects certain globals to be contiguous with each other, or "
169+
"makes other assumptions which are invalidated by HWASan "
170+
"instrumentation."),
171+
cl::Hidden, cl::init(false));
172+
163173
static cl::opt<int> ClMatchAllTag(
164174
"hwasan-match-all-tag",
165175
cl::desc("don't report bad accesses via pointers with this tag"),
@@ -1780,11 +1790,21 @@ void HWAddressSanitizer::instrumentGlobals() {
17801790
if (GV.hasCommonLinkage())
17811791
continue;
17821792

1783-
// Globals with custom sections may be used in __start_/__stop_ enumeration,
1784-
// which would be broken both by adding tags and potentially by the extra
1785-
// padding/alignment that we insert.
1786-
if (GV.hasSection())
1787-
continue;
1793+
if (ClAllGlobals) {
1794+
// Avoid adding metadata emitted for the hwasan instrumentation itself.
1795+
// Code which makes assumptions about memory layout of globals between
1796+
// __start_<section>/__end_<section> linker-generated symbols may need
1797+
// manual adaptation.
1798+
auto Section = GV.getSection();
1799+
if (Section == "hwasan_globals" || Section == ".note.hwasan.globals")
1800+
continue;
1801+
} else {
1802+
// Globals with custom sections may be used in __start_/__stop_
1803+
// enumeration, which would be broken both by adding tags and potentially
1804+
// by the extra padding/alignment that we insert.
1805+
if (GV.hasSection())
1806+
continue;
1807+
}
17881808

17891809
Globals.push_back(&GV);
17901810
}

llvm/test/Instrumentation/HWAddressSanitizer/globals.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
; RUN: opt < %s -S -passes=hwasan -mtriple=aarch64--linux-android29 | FileCheck --check-prefixes=CHECK,CHECK29 %s
2-
; RUN: opt < %s -S -passes=hwasan -mtriple=aarch64--linux-android30 | FileCheck --check-prefixes=CHECK,CHECK30 %s
1+
; RUN: opt < %s -S -passes=hwasan -mtriple=aarch64--linux-android29 | FileCheck --check-prefixes=CHECK,CHECK29,NOALLGLOBALS %s
2+
; RUN: opt < %s -S -passes=hwasan -mtriple=aarch64--linux-android30 | FileCheck --check-prefixes=CHECK,CHECK30,NOALLGLOBALS %s
3+
; RUN: opt < %s -S -passes=hwasan -mtriple=riscv64-unknown-elf -hwasan-globals=1 -hwasan-all-globals=1 | FileCheck --check-prefixes=CHECK,CHECK30,ALLGLOBALS %s
34

45
; CHECK29: @four = global
56

67
; CHECK: @specialcaselisted = global i16 2, no_sanitize_hwaddress
7-
; CHECK: @insection = global i16 2, section "custom"
8+
; NOALLGLOBALS: @insection = global i16 2, section "custom"
89
; CHECK: @__start_hwasan_globals = external hidden constant [0 x i8]
910
; CHECK: @__stop_hwasan_globals = external hidden constant [0 x i8]
1011

@@ -22,6 +23,8 @@
2223
; CHECK30: @huge.hwasan.descriptor = private constant { i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint (ptr @huge.hwasan to i64), i64 ptrtoint (ptr @huge.hwasan.descriptor to i64)) to i32), i32 -1358954512 }, section "hwasan_globals", !associated [[HUGE:![0-9]+]]
2324
; CHECK30: @huge.hwasan.descriptor.1 = private constant { i32, i32 } { i32 trunc (i64 add (i64 sub (i64 ptrtoint (ptr @huge.hwasan to i64), i64 ptrtoint (ptr @huge.hwasan.descriptor.1 to i64)), i64 16777200) to i32), i32 -1375731680 }, section "hwasan_globals", !associated [[HUGE]]
2425

26+
; ALLGLOBALS: @insection.hwasan = private global { i16, [14 x i8] } { i16 2, [14 x i8] c"\00\00\00\00\00\00\00\00\00\00\00\00\00\AF" }, section "custom", align 16
27+
2528
; CHECK30: @four = alias i32, inttoptr (i64 add (i64 ptrtoint (ptr @four.hwasan to i64), i64 -6052837899185946624) to ptr)
2629
; CHECK30: @sixteen = alias [16 x i8], inttoptr (i64 add (i64 ptrtoint (ptr @sixteen.hwasan to i64), i64 -5980780305148018688) to ptr)
2730
; CHECK30: @huge = alias [16777232 x i8], inttoptr (i64 add (i64 ptrtoint (ptr @huge.hwasan to i64), i64 -5908722711110090752) to ptr)

0 commit comments

Comments
 (0)