blob: f44c07722fac0f554ba59387c1a60b95d4fbe8b3 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llubi_test_checks.py UTC_ARGS: --version 6
; RUN: not llubi --verbose < %s 2>&1 | FileCheck %s
target datalayout = "e-p:64:64:64"
define void @main() {
%alloc1 = alloca i32
%alloc2 = alloca i32
%addr1 = ptrtoint ptr %alloc1 to i64
%addr2 = ptrtoint ptr %alloc2 to i64
%ptrdiff = sub i64 %addr2, %addr1
%p = inttoptr i64 %addr1 to ptr
%gep = getelementptr i8, ptr %p, i64 %ptrdiff
; After %alloc1 is accessed, we cannot access other memory objects later.
store i32 0, ptr %p
; %gep2 is poison as the wildcard provenance has been resolved to %alloc1.
%gep2 = getelementptr inbounds i8, ptr %p, i64 %ptrdiff
; Now we cannot access %alloc2 via the pointer derived from %p.
store i32 0, ptr %gep
ret void
}
; CHECK: Entering function: main
; CHECK-NEXT: %alloc1 = alloca i32, align 4 => ptr 0x8 [alloc1]
; CHECK-NEXT: %alloc2 = alloca i32, align 4 => ptr 0x10 [alloc2]
; CHECK-NEXT: %addr1 = ptrtoint ptr %alloc1 to i64 => i64 8
; CHECK-NEXT: %addr2 = ptrtoint ptr %alloc2 to i64 => i64 16
; CHECK-NEXT: %ptrdiff = sub i64 %addr2, %addr1 => i64 8
; CHECK-NEXT: %p = inttoptr i64 %addr1 to ptr => ptr 0x8 [wildcard]
; CHECK-NEXT: %gep = getelementptr i8, ptr %p, i64 %ptrdiff => ptr 0x10 [wildcard]
; CHECK-NEXT: store i32 0, ptr %p, align 4
; CHECK-NEXT: %gep2 = getelementptr inbounds i8, ptr %p, i64 %ptrdiff => poison
; CHECK-NEXT: Stacktrace:
; CHECK-NEXT: #0 store i32 0, ptr %gep, align 4 at @main <stdin>:24
; CHECK-NEXT: Immediate UB detected: Invalid memory access via a pointer with nullary provenance.
; CHECK-NEXT: error: Execution of function 'main' failed.