efriedma added a comment.

In D58236#1416765 <https://reviews.llvm.org/D58236#1416765>, @Anastasia wrote:

> In D58236#1414069 <https://reviews.llvm.org/D58236#1414069>, @efriedma wrote:
>
> > > I think trying to reject code that is doing something dangerous is a good 
> > > thing!
> >
> > Refusing to compile code which is suspicious, but not forbidden by the 
> > specification, will likely cause compatibility issues; there are legitimate 
> > reasons to use casts which look weird.
>
>
> The spec dioesn't allow these conversions either, it just simply doesn't 
> cover this corner case at all. I don't think we are changing anything in 
> terms of compatibility. If you have any examples of such casts that can be 
> legitimate I would like to understand them better. What I have seen so far 
> were the examples where `addrspacecast` was lost in IR for the memory 
> segments translation and therefore wrong memory areas were accessed.


The spec just says that the casts follow C rules... and C says you can cast a 
pointer to an object type to a pointer to another object type (subject to 
alignment restrictions).  By default, a pointer to a pointer isn't special.

In practice, unusual casts tend to show up in code building a datastructure 
using union-like constructs.  In plain C, for example, sometimes you have a 
pointer to a float, and sometimes you have a pointer to an int, determined 
dynamically.  I expect similar cases show up where a pointer points to memory 
which contains either a pointer in the global address-space, or a pointer in 
the local address-space, determined dynamically.  In some cases, it might be 
clearer to use void* in more places, but that's mostly style issue.

>> I'm not against adding some sort of address space suspicious cast warning to 
>> catch cases where we think the user meant to do something else.
> 
> I simply don't see how these conversions can be useful and some are 
> definitely indirectly forbidden (there is no precise wording however). There 
> are other ways to perform such conversions differently (by being more 
> explicit) where correct IR can be then generated with `addrspacecast`. I 
> don't think we are loosing anything in terms of functionality.

In some cases, the correct code may not involve an addrspacecast at all; the 
pointer could just have the "wrong" pointee type, and the code expects to 
explicitly fix it.  In that case, how do you fix it?  Write `(foo*)(void*)p` 
instead of `(foo*)p`?

>> But that's a separate issue, and it needs a proper cost-benefit analysis, 
>> including an analysis of the false-positive rate on existing code.
> 
> Do you have any suggestions how to do this in practice with such rare corner 
> case?

If the warning never triggers on any code you have access to, that would still 
be a useful datapoint.


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

https://reviews.llvm.org/D58236



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

Reply via email to