https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104929
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- In this particular case the problem is that UBSAN adds the non-NULL tests, so the IL becomes if (!s) __ubsan_handle_nonnull_arg (...); sprintf(s, " "); if (!s) __ubsan_handle_nonnull_arg (...); return __builtin_strlen(s); and then jump threading thinks it is a good idea to thread it, so turns it into if (!s) { __ubsan_handle_nonnull_arg (...); sprintf(NULL, " "); __ubsan_handle_nonnull_arg (...); } else sprintf(s, " "); and that is why the warning is emitted (pain of all the middle-end warnings). The ways out of this might be convince jump threading to punt in such cases (when those are clearly ubsan tests) because we expect them to be extremely unlikely, or use some new internal function from between the ubsan pass and sanopt, where the test for non-NULL wouldn't be explicit in the IL until very late (that would also prevent the jump threading), or during the jump threading when we detect these ubsan-ish tests suppress some of the warnings on the threaded stmts.