https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119958
Bug ID: 119958 Summary: UBSAN: Replacing add with lea leads to false positive Product: gcc Version: 15.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: sanitizer Assignee: unassigned at gcc dot gnu.org Reporter: stefan at bytereef dot org CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org, jakub at gcc dot gnu.org, kcc at gcc dot gnu.org Target Milestone: --- Hi, I can submit a somewhat chaotic test case that is difficult to make smaller and less chaotic, but if my guess is correct, the issue might be resolved by looking at assembly snippets and this issue: https://reviews.llvm.org/D131716 My guess is that addq is replaced by leaq, which does not clear the zero flag, leading to a jump to __ubsan_handle_type_mismatch_v1, which results in: apitest.cc:17:43: runtime error: member call on null pointer of type 'struct Context' Using clang++ and UBSAN does not exhibit this issue. The relevant generated assembly of the test case (-O3 -g -fsanitize=undefined -S) is: ================================================================= .LVL3256: xorl %esi, %esi ### sets the zero flag movq %rbx, %rax addq context@gottpoff(%rip), %rax ### add is replaced by lea movl %esi, -28(%rbp) je .L4844 ### jump uses the zero flag from xor [snip] .L4844: xorl %esi, %esi movl $.Lubsan_data6185, %edi call __ubsan_handle_type_mismatch_v1 ================================================================= When actually compiled with "-O3 -g -fsanitize=undefined", gdb shows that lea is used: ================================================================= (gdb) display/i $pc => 0x400b21 <RealTest()-10655>: xor %esi,%esi => 0x400b23 <RealTest()-10653>: mov %rbx,%rax => 0x400b26 <RealTest()-10650>: lea -0x10(%rax),%rax ### <<== here => 0x400b2d <RealTest()-10643>: mov %esi,-0x1c(%rbp) => 0x400b30 <RealTest()-10640>: je 0x400cbe <RealTest()-10242> => 0x400cbe <RealTest()-10242>: xor %esi,%esi => 0x400cc0 <RealTest()-10240>: mov $0x4176a0,%edi => 0x400cc5 <RealTest()-10235>: call 0x4005e0 <__ubsan_handle_type_mismatch_v1@plt> (gdb) c Continuing. apitest.cc:17:43: runtime error: member call on null pointer of type 'struct Context' =================================================================