On Fri, Mar 17, 2023 at 12:50 PM Kees Cook <keescook@xxxxxxxxxxxx> wrote: > > I've hit these cases a few times too. The __ubsan_handle_* stuff > is designed to be recoverable. I think there are some cases where > we're tripping over Clang bugs, though. Some of the past issues > have been with Clang thinking some UBSAN feature was trap-only > (e.g. -fsanitizer=local-bounds), but here it actually generated the call, > but decided it was no-return. *sigh* Hmm. The problem here is that we only get an objdump warning by pure luck. This isn't a "objdump will always catch it", it's more like "objdump will only catch it if the code happens to be moved to the end of the function". So I'm very happy to hear that it's not by design, and that's very good. But the whole "this is a compiler bug" doesn't exactly give me the warm and fuzzies either. The code generation looks *really* odd to me. This is, as far as I can tell, the code sequence that this code has: m5mols_set_fmt: .. movq %rdx, %rbp .. movl 16(%rbp), %ebx movq %rbx, %rdi .. cmpq $16385, %rbx # imm = 0x4001 jne .LBB24_1 .. .LBB24_1: cmpl $8199, %ebx # imm = 0x2007 jne .LBB24_3 .. .LBB24_3: callq __sanitizer_cov_trace_pc@PLT movl $2, %esi movq $.L__unnamed_3, %rdi callq __ubsan_handle_out_of_bounds and as far as I can tell, that "movl 16(%rbp), %ebx" is enum m5mols_restype stype = __find_restype(mf->code); in __find_resolution(). But I don't understand those odd constants it's comparing against at all. 'enum m5mols_restype' should be in the range 0..2, but it seems to use a 64-bit compare against '16385' (and then a 32-bit compare against '8199') to decide it's out-of-bounds. I must be *completely* mis-reading this, because none of that makes a whit of sense to me. It's possible that clang is just *so* terminally confused that it just generates random code, but it's more likely that I'm mis-reading things. The above is my interpretation of what I see with the current F37 clang version for a "allmodconfig" build of that file. My 'clang -v' says clang version 15.0.7 (Fedora 15.0.7-1.fc37) in case some clang person wants to try to recreate this. > I'm not opposed to disabling UBSAN for all*config builds if we need to, > but I want to get these Clang bugs found and fixed so I'd be sad to lose > the coverage. I wonder how many people actually end up having UBSAN actually enabled. I get the feeling that most of the coverage it gets is exactly just the compile-only coverage by "allmodconfig" and friends. Otherwise it would be really easy to just say depends on !COMPILE_TEST for all these run-time debug things. But exactly *because* they have caused endless amounts of build-time pain - *and* because I doubt how much real run-time testing they get - limiting it to non-build tests sounds a bit counter-productive. Linus