dtcxzyw wrote:

> this check needs to happen at a higher level. And at that level, you should 
> have an Expr*, not just an Address.

I tried to use `Expr::isNullPointerConstant` in 
`CodeGenFunction::EmitMemberExpr`:
https://github.com/llvm/llvm-project/blob/59fd2878fce470f02058f43d4b818ed68ce04094/clang/lib/CodeGen/CGExpr.cpp#L4774-L4781
```
struct S {
  int x, y;
};

using uintptr_t = unsigned long long;
uintptr_t get_offset_of_y_naively() {
  return ((uintptr_t)(&(((S *)nullptr)->y)));
}
```
The base expr is:
```
ParenExpr 0x58d207ad2048 'S *'
`-CStyleCastExpr 0x58d207ad2020 'S *' <NoOp>
  `-ImplicitCastExpr 0x58d207ad2008 'S *' <NullToPointer> part_of_explicit_cast
    `-CXXNullPtrLiteralExpr 0x58d207ad1f80 'nullptr_t'
```
`isNullPointerConstant` returns false regardless of the value of 
NullPointerConstantValueDependence.

> Do you care at all about patterns like ((uintptr_t)(&(((S *)nullptr)->y.z)));?

Yes. This pattern is used by openssl.


https://github.com/llvm/llvm-project/pull/130734
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to