[clang] [Reland][Clang][CodeGen][UBSan] Add more precise attributes to recoverable ubsan handlers (PR #135135)
Yingwei Zheng via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 18 19:09:07 PDT 2025
dtcxzyw wrote:
> This change broke a couple of ubsan tests on i686 on Windows (i.e. a 32 bit environment): https://github.com/mstorsjo/llvm-mingw/actions/runs/14527591706/job/40770945907
>
> The failing tests are https://github.com/llvm/llvm-project/blob/llvmorg-20.1.3/compiler-rt/test/ubsan/TestCases/Misc/abs.cpp and https://github.com/llvm/llvm-project/blob/llvmorg-20.1.3/compiler-rt/test/ubsan/TestCases/ImplicitConversion/bitfield-conversion.c.
>
> The diff in ubsan output from `abs.cpp` looks like this:
>
> ```diff
> @@ -6,7 +6,7 @@
> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:19:18
> compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:20:8: runtime error: negation of -2147483648 cannot be represented in type 'long'; cast to an unsigned type to negate this value to itself
> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:20:8
> -compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:24:19: runtime error: negation of -9223372036854775808 cannot be represented in type 'long long'; cast to an unsigned type to negate this value to itself
> +compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:24:19: runtime error: negation of 14963666063463584 cannot be represented in type 'long long'; cast to an unsigned type to negate this value to itself
> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:24:19
> -compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:25:9: runtime error: negation of -9223372036854775808 cannot be represented in type 'long long'; cast to an unsigned type to negate this value to itself
> +compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:25:9: runtime error: negation of 8880086229349853276 cannot be represented in type 'long long'; cast to an unsigned type to negate this value to itself
> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior compiler-rt/test/ubsan/TestCases/Misc/abs.cpp:25:9
> ```
IR output is correct.
```
bin/clang --target=i686-w64-windows-gnu -emit-llvm -S -fsanitize=signed-integer-overflow -O3 -fsanitize-recover=signed-integer-overflow -w -o - /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/clang/test/CodeGen/AArch64/ubsan-handler-pass-by-ref.c
; ModuleID = '/home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/clang/test/CodeGen/AArch64/ubsan-handler-pass-by-ref.c'
source_filename = "/home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/clang/test/CodeGen/AArch64/ubsan-handler-pass-by-ref.c"
target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32"
target triple = "i686-w64-windows-gnu"
@.src = private unnamed_addr constant [111 x i8] c"/home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/clang/test/CodeGen/AArch64/ubsan-handler-pass-by-ref.c\00", align 1
@0 = private unnamed_addr constant { i16, i16, [12 x i8] } { i16 0, i16 13, [12 x i8] c"'long long'\00" }
@1 = private unnamed_addr global { { ptr, i32, i32 }, ptr } { { ptr, i32, i32 } { ptr @.src, i32 17, i32 19 }, ptr @0 }
; Function Attrs: nounwind memory(read, inaccessiblemem: readwrite)
define dso_local noundef i32 @main() local_unnamed_addr #0 {
entry:
%tmp = alloca i64, align 8
store i64 -9223372036854775808, ptr %tmp, align 8, !nosanitize !5
%0 = ptrtoint ptr %tmp to i32, !nosanitize !5
call void @__ubsan_handle_negate_overflow(ptr nonnull @1, i32 %0) #2, !nosanitize !5
ret i32 0
}
; Function Attrs: memory(read, inaccessiblemem: readwrite) uwtable
declare dso_local void @__ubsan_handle_negate_overflow(ptr, i32) local_unnamed_addr #1
attributes #0 = { nounwind memory(read, inaccessiblemem: readwrite) "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { memory(read, inaccessiblemem: readwrite) uwtable }
attributes #2 = { nounwind }
!llvm.module.flags = !{!0, !1, !2}
!llvm.linker.options = !{!3}
!llvm.ident = !{!4}
!0 = !{i32 1, !"NumRegisterParameters", i32 0}
!1 = !{i32 1, !"wchar_size", i32 2}
!2 = !{i32 1, !"MaxTLSAlign", i32 65536}
!3 = !{!"/DEFAULTLIB:libclang_rt.ubsan_standalone.a"}
!4 = !{!"clang version 21.0.0git"}
!5 = !{}
```
And the codegen looks good.
```
.def @feat.00;
.scl 3;
.type 0;
.endef
.globl @feat.00
.set @feat.00, 1
.file "ubsan-handler-pass-by-ref.c"
.def _main;
.scl 2;
.type 32;
.endef
.text
.globl _main # -- Begin function main
.p2align 4
_main: # @main
# %bb.0: # %entry
pushl %ebp
movl %esp, %ebp
andl $-8, %esp
subl $8, %esp
calll ___main
movl $-2147483648, 4(%esp) # imm = 0x80000000
movl $0, (%esp)
movl %esp, %eax
pushl %eax
pushl $L___unnamed_1
calll ___ubsan_handle_negate_overflow
addl $8, %esp
xorl %eax, %eax
movl %ebp, %esp
popl %ebp
retl
# -- End function
.section .rdata,"dr"
L_.src: # @.src
.asciz "/home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/clang/test/CodeGen/AArch64/ubsan-handler-pass-by-ref.c"
.p2align 2, 0x0 # @0
L___unnamed_2:
.short 0 # 0x0
.short 13 # 0xd
.asciz "'long long'"
.data
.p2align 2, 0x0 # @1
L___unnamed_1:
.long L_.src
.long 17 # 0x11
.long 19 # 0x13
.long L___unnamed_2
.section .drectve,"yni"
.ascii " /DEFAULTLIB:libclang_rt.ubsan_standalone.a"
.addrsig
```
https://github.com/llvm/llvm-project/pull/135135
More information about the cfe-commits
mailing list