https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114217
--- Comment #13 from Akihiko Odaki <akihiko.odaki at daynix dot com> ---
(In reply to Jakub Jelinek from comment #12)
> (In reply to Akihiko Odaki from comment #11)
> > So there are two constructs invoking UBs but ignored by UBSan: 1)
>
> That is an understatement. UBSan is a best effort which diagnoses some forms
> of undefined behavior. There are tons of undefined behavior UBSan doesn't
> catch,
> most importantly e.g. aliasing violations, but far from limited to just that.
> If a program is diagnostic free with -fsanitize=undefined,address , it
> doesn't mean it is UB free, but the goal is that if there is diagnostic,
> there is a real UB in the program.
Right. I just listed the two relevant constructs and don't intend to say they
are the only case that UBSan doesn't catch.
>
> You are basically asking for the PR80797 fix to be reverted just because you
> aren't willing to fix UB in your code. That is not going to happen, we've
> been diagnosing this for almost 7 years now, I think clang even for 11
> years, it is a real UB and other projects have been able to cope with it.
> By reverting the change new UB in other programs couldn't be discovered.
I'm not asking for reverting PR80797. See f() and f2() I wrote earlier:
u64 f(struct dir_entry *entry)
{
return get_unaligned(&entry->offset);
}
u64 f2(u64 *offset)
{
return get_unaligned(offset);
}
Both f(NULL) and f2(NULL) should be caught and there should be no discrepancy
in behavior for these two functions. However, there is a discrepancy when it
comes to -fsanitize=alignment.
I'm not saying ignoring UB in f() is the only sensible option either. Catching
UBs in both f() and f2() is a logical option.