| ; 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. |