Skip to content

Commit

Permalink
[asan] Pre-commit test with global constructor without any global (ll…
Browse files Browse the repository at this point in the history
…vm#104620)

In this test `@initializer()` can access globals
outside of the module, but Asan does nothing to
detect that.
  • Loading branch information
vitalybuka committed Aug 16, 2024
1 parent 5ef2456 commit 085b04b
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
26 changes: 26 additions & 0 deletions compiler-rt/test/asan/TestCases/initialization-bug-no-global.cpp
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;
}
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
}

0 comments on commit 085b04b

Please sign in to comment.