forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[asan] Pre-commit test with global constructor without any global (ll…
…vm#104620) In this test `@initializer()` can access globals outside of the module, but Asan does nothing to detect that.
- Loading branch information
1 parent
5ef2456
commit 085b04b
Showing
2 changed files
with
60 additions
and
0 deletions.
There are no files selected for viewing
26 changes: 26 additions & 0 deletions
26
compiler-rt/test/asan/TestCases/initialization-bug-no-global.cpp
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,26 @@ | ||
// RUN: %clangxx_asan %min_macos_deployment_target=10.11 -O0 %s %p/Helpers/initialization-bug-extra.cpp -o %t | ||
// RUN: %env_asan_opts=check_initialization_order=true:strict_init_order=true not %run %t 2>&1 | FileCheck %s | ||
|
||
// Not implemented. | ||
// XFAIL: * | ||
|
||
// Do not test with optimization -- the error may be optimized away. | ||
|
||
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=186 | ||
// XFAIL: target={{.*windows-msvc.*}} | ||
|
||
#include <stdio.h> | ||
|
||
extern int y; | ||
|
||
void __attribute__((constructor)) ctor() { | ||
printf("%d\n", y); | ||
// CHECK: AddressSanitizer: initialization-order-fiasco | ||
} | ||
|
||
int main() { | ||
// ASan should have caused an exit before main runs. | ||
printf("PASS\n"); | ||
// CHECK-NOT: PASS | ||
return 0; | ||
} |
34 changes: 34 additions & 0 deletions
34
llvm/test/Instrumentation/AddressSanitizer/instrument_initializer_without_global.ll
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,34 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --global-value-regex ".*global_ctors.*" --version 5 | ||
; RUN: opt < %s -passes=asan -S | FileCheck %s | ||
; RUN: opt < %s -passes=asan -S -asan-initialization-order=0 | FileCheck %s --check-prefixes=NOINIT | ||
|
||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }] | ||
|
||
declare void @initializer() uwtable; | ||
|
||
;. | ||
; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] | ||
;. | ||
; NOINIT: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] | ||
;. | ||
define internal void @__late_ctor() sanitize_address section ".text.startup" { | ||
; CHECK-LABEL: define internal void @__late_ctor( | ||
; CHECK-SAME: ) #[[ATTR1:[0-9]+]] section ".text.startup" { | ||
; CHECK-NEXT: [[ENTRY:.*:]] | ||
; CHECK-NEXT: call void @initializer() | ||
; CHECK-NEXT: ret void | ||
; | ||
; NOINIT-LABEL: define internal void @__late_ctor( | ||
; NOINIT-SAME: ) #[[ATTR1:[0-9]+]] section ".text.startup" { | ||
; NOINIT-NEXT: [[ENTRY:.*:]] | ||
; NOINIT-NEXT: call void @initializer() | ||
; NOINIT-NEXT: ret void | ||
; | ||
entry: | ||
|
||
call void @initializer() | ||
ret void | ||
} |