================
@@ -144,9 +144,24 @@ void PointerSubChecker::checkPreStmt(const BinaryOperator 
*B,
     // Allow arithmetic on different symbolic regions.
     if (isa<SymbolicRegion>(SuperLR) || isa<SymbolicRegion>(SuperRR))
       return;
+    if (const auto *SuperDLR = dyn_cast<DeclRegion>(SuperLR))
+      DiffDeclL = SuperDLR->getDecl();
+    if (const auto *SuperDRR = dyn_cast<DeclRegion>(SuperRR))
+      DiffDeclR = SuperDRR->getDecl();
----------------
NagyDonat wrote:

Note that `FieldRegion`s are `DeclRegion`s, so these declarations may be data 
member declarations within a `struct` or `class`. This is usually not a 
problem, but there is a corner case where `SuperLR != SuperRR`, but the 
corresponding declarations are identical:
```
struct {
  int array[5];
} a, b;
int func(void) {
  return &a.array[3] - &b.array[2];
}
```
In this case the current code would place both notes onto the declaration of 
`field`, which would be confusing for the user.

Consider adding some code that handles this situation explicitly. (Either 
simply skip note creation when `DiffDeclL == DiffDeclR`, or create a 
specialized note for this case.)

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

Reply via email to