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