lebedev.ri added a comment.

In D100037#2674610 <https://reviews.llvm.org/D100037#2674610>, @rsmith wrote:

>> This is somewhat related to the following RFC by @rjmccall:
>> https://lists.llvm.org/pipermail/llvm-dev/2016-January/094012.html
>
> It looks to me like this direction is in conflict with that RFC. In 
> particular, it says:
>
>> It is not undefined behavior to create a pointer that is less aligned
>>  than its pointee type.  Instead, it is only undefined behavior to
>>  access memory through a pointer that is less aligned than its pointee
>>  type.
>
> ... and gives as an example that passing an underaligned pointer to a 
> function that doesn't perform an underaligned access is OK under the proposed 
> rule.

Yes. We now have a motivational reason to do so, it wouldn't be "just expose 
the UB for the sake of miscompiling the program".

> Putting this behind a `-fstrict-*` flag (as this patch does) seems OK to me, 
> but I think enabling it by default on any target would be inconsistent with 
> the RFC and would need broader discussion and a change in policy.

I suppose so.

> I think it is reasonable to add stricter UBSan checks for underaligned 
> pointers, but that should be available regardless of what properties our 
> implementation happens to treat as defined; part of the point of UBSan is to 
> check for portability issues and to check whether problems would arise as a 
> prerequisite for enabling the corresponding `-fstrict` flag. So I do not 
> think the checks should be gated behind the `-fstrict` flag. I don't think 
> this is analogous to `-fwrapv`, which actually opts into a different set of 
> language rules where integer overflow is defined; this is more like 
> `-fstrict-enums`, for which we will still sanitize even in cases where we 
> happen to choose to not optimize, or the sanitizer for floating-point 
> division by zero, for which we still sanitize (because it's formally UB) but 
> don't include in `-fsanitize=undefined` (because our implementation defines 
> it). Generally-speaking, things controlled by `-fstrict-*` flags are checked 
> by UBSan and in particular by `-fsanitize=undefined` regardless of whether 
> the `-fstrict-*` flag is specified, and I think there are some cases where 
> `-fsanitize=undefined` already diagnoses misalignment that is valid under 
> John's RFC, so adding the new checks to the `-fsanitize=undefined` sanitizer 
> group (regardless of `-fstrict`) seems consistent to me.

Aha. I was also very uneasy about doing the check behind the `-fstrict`.
Will change it to be unconditional!

> If we want to add a sanitizer that checks for misaligned pointers existing, 
> instead of checking (as our current alignment sanitizer does) for misaligned 
> accesses, then I think it would be more precise (and add a lot fewer checks) 
> to enforce the language rule as written, that is, check for pointer and 
> reference casts to a more-aligned type, rather than checking function 
> arguments. I assume your intent here is to eventually add LLVM parameter 
> attributes indicating the function argument is correctly-aligned, which is 
> why you're checking on call boundaries?

It's complicated. I would like this to be more strict, and catch any misaligned 
pointers, yes.
But, two things:

1. it's going to be much more noisy than only dealing with function arguments :)
2. even if we are okay with that, handling this *just* on the callers side 
(when the pointer is created) is a wrong solution here. we still need to do 
this on the callee side. because we can't be sure that the caller will be 
compiled with sanitizer, but we *know* that the callee will be micompiled by us.

So at most i could handle it in more cases, but this one should stay..
Does this make sense?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100037/new/

https://reviews.llvm.org/D100037

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to