Unverified Commit 4d093aa7 authored by Yingwei Zheng's avatar Yingwei Zheng Committed by GitHub
Browse files

[llubi] Check undefined bits when !noundef is set (#195642)

Address one of the todos in
https://github.com/llvm/llvm-project/pull/195339. Currently it just
checks the loaded value after applying poison-generating metadata. This
patch also takes uninitialized bits in the memory into account.
parent aeb89698
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
; 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

define void @main() {
  %p = alloca i32
  store i32 poison, ptr %p
  %res = load i32, ptr %p, !noundef !{}
  ret void
}
; CHECK: Entering function: main
; CHECK-NEXT:   %p = alloca i32, align 4 => ptr 0x8 [p]
; CHECK-NEXT:   store i32 poison, ptr %p, align 4
; CHECK-NEXT: Stacktrace:
; CHECK-NEXT: #0   %res = load i32, ptr %p, align 4, !noundef !0 at @main
; CHECK-NEXT: Immediate UB detected: The value loaded contains undefined bits.
; CHECK-NEXT: error: Execution of function 'main' failed.
+16 −0
Original line number Diff line number Diff line
; 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

define void @main() {
  %p = alloca i8
  store <2 x i4> <i4 1, i4 poison>, ptr %p
  %res = load i4, ptr %p, !noundef !{}
  ret void
}
; CHECK: Entering function: main
; CHECK-NEXT:   %p = alloca i8, align 1 => ptr 0x8 [p]
; CHECK-NEXT:   store <2 x i4> <i4 1, i4 poison>, ptr %p, align 1
; CHECK-NEXT: Stacktrace:
; CHECK-NEXT: #0   %res = load i4, ptr %p, align 1, !noundef !0 at @main
; CHECK-NEXT: Immediate UB detected: The value loaded contains undefined bits.
; CHECK-NEXT: error: Execution of function 'main' failed.
+14 −0
Original line number Diff line number Diff line
; 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

define void @main() {
  %p = alloca i32
  %res = load i32, ptr %p, !noundef !{}
  ret void
}
; CHECK: Entering function: main
; CHECK-NEXT:   %p = alloca i32, align 4 => ptr 0x8 [p]
; CHECK-NEXT: Stacktrace:
; CHECK-NEXT: #0   %res = load i32, ptr %p, align 4, !noundef !0 at @main
; CHECK-NEXT: Immediate UB detected: The value loaded contains undefined bits.
; CHECK-NEXT: error: Execution of function 'main' failed.
+7 −0
Original line number Diff line number Diff line
@@ -107,6 +107,10 @@ define void @main() {
  %load_int_non_zero_padding = load i33, ptr %alloc_padding_vec
  %load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec

  %alloc_struct_padding = alloca {i8, i32}
  store {i8, i32} zeroinitializer, ptr %alloc_struct_padding
  %load_struct_noundef = load {i8, i32}, ptr %alloc_struct_padding, !noundef !{}

  ret void
}
; CHECK: Entering function: main
@@ -186,5 +190,8 @@ define void @main() {
; CHECK-NEXT:   %load_vec = load <6 x i5>, ptr %alloc_padding_vec, align 4 => { i5 0, i5 0, i5 0, i5 0, i5 0, i5 0 }
; CHECK-NEXT:   %load_int_non_zero_padding = load i33, ptr %alloc_padding_vec, align 8 => i33 255
; CHECK-NEXT:   %load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec, align 8 => { i11 0, i11 0, i11 255 }
; CHECK-NEXT:   %alloc_struct_padding = alloca { i8, i32 }, align 8 => ptr 0x88 [alloc_struct_padding]
; CHECK-NEXT:   store { i8, i32 } zeroinitializer, ptr %alloc_struct_padding, align 4
; CHECK-NEXT:   %load_struct_noundef = load { i8, i32 }, ptr %alloc_struct_padding, align 4, !noundef !0 => { i8 0, i32 0 }
; CHECK-NEXT:   ret void
; CHECK-NEXT: Exiting function: main
+7 −0
Original line number Diff line number Diff line
@@ -108,6 +108,10 @@ define void @main() {
  %load_int_non_zero_padding = load i33, ptr %alloc_padding_vec
  %load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec

  %alloc_struct_padding = alloca {i8, i32}
  store {i8, i32} zeroinitializer, ptr %alloc_struct_padding
  %load_struct_noundef = load {i8, i32}, ptr %alloc_struct_padding, !noundef !{}

  ret void
}
; CHECK: Entering function: main
@@ -188,5 +192,8 @@ define void @main() {
; CHECK-NEXT:   %load_vec = load <6 x i5>, ptr %alloc_padding_vec, align 4 => { i5 0, i5 0, i5 0, i5 0, i5 0, i5 0 }
; CHECK-NEXT:   %load_int_non_zero_padding = load i33, ptr %alloc_padding_vec, align 8 => poison
; CHECK-NEXT:   %load_vec_non_zero_padding = load <3 x i11>, ptr %alloc_padding_vec, align 8 => { poison, poison, poison }
; CHECK-NEXT:   %alloc_struct_padding = alloca { i8, i32 }, align 8 => ptr 0x88 [alloc_struct_padding]
; CHECK-NEXT:   store { i8, i32 } zeroinitializer, ptr %alloc_struct_padding, align 4
; CHECK-NEXT:   %load_struct_noundef = load { i8, i32 }, ptr %alloc_struct_padding, align 4, !noundef !0 => { i8 0, i32 0 }
; CHECK-NEXT:   ret void
; CHECK-NEXT: Exiting function: main
Loading