blob: aaf305b3851c86aeb09039f9e7f50b8fe579fc1a [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
%gep1 = getelementptr i8, ptr %p, i64 %ptrdiff
%gep2 = getelementptr inbounds i8, ptr %gep1, i64 2
; We can access %alloc1, although %gep2 has been resolved to %alloc2.
store i32 0, ptr %p
; Now we cannot access %alloc2 through %gep2, since the wildcard provenance has been resolved to %alloc1.
store i16 0, ptr %gep2
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: %gep1 = getelementptr i8, ptr %p, i64 %ptrdiff => ptr 0x10 [wildcard]
; CHECK-NEXT: %gep2 = getelementptr inbounds i8, ptr %gep1, i64 2 => ptr 0x12 [alloc2 + 2]
; CHECK-NEXT: store i32 0, ptr %p, align 4
; CHECK-NEXT: Stacktrace:
; CHECK-NEXT: #0 store i16 0, ptr %gep2, align 2 at @main <stdin>:23
; CHECK-NEXT: Immediate UB detected: Invalid memory access via a pointer with nullary provenance.
; CHECK-NEXT: error: Execution of function 'main' failed.