[clang] [analyzer] Enforce not making overly complicated symbols (PR #144327)
DonĂ¡t Nagy via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 27 04:12:51 PDT 2025
NagyDonat wrote:
> The bug was that we inserted the `T` into the expected `InsertPos` corresponding to the `Profile` of `T` - so far so good, but instead of returning that, we checked if this is "overly complicated", and if so, we created the new `SymbolOverlyComplex` symbol and returned that instead. However, when the next time we get to call `acquired<T>`, we would simply get a successful lookup for the `Profile` of `T` and return the symbol we actually wanted to hide! instead of returning the `SymbolOverlyComplex` that we returned in the previous `acquire<T>` call. [...]
Ugh, the stateful nature of these hashtable data structures is evil...
> Otherwise, we need to look up the wrapped symbol first, then check if we have a `SymbolOverlyComplex` with that wrapped symbol in the map. If there is, just return that one, otherwise we create it.
I have to admit that I don't understand the role and meaning of "the wrapped symbol" in your code.
However, I think I see another, less complex approach for "fixing" the method `acquire`: instead of creating the `Dummy` symbol and calculating its complexity early, just modify the original state of the method (i.e. the parent revision of https://github.com/llvm/llvm-project/pull/144327/commits/8c29bbc6c309efe0a1d6af948f95dbb9654971b8 ) by moving the order block
```
if (SD->complexity() > MaxCompComplexity) {
return cast<Ret>(acquire<SymbolOverlyComplex>(SD));
}
```
out of the `if (!SD)` block (placing it directly after the `if (!SD)` block).
This would guarantee that:
- we always return `SymbolOverlyComplex` if the expression is too complex (even if there is a cache hit);
- but even these overly complex symbols (which only live "inside" the `SymbolOverlyComplex` block) enjoy the benefit of caching and aren't recreated repeatedly.
I hope that this alternative approach could prevent the performance hit that you observed.
https://github.com/llvm/llvm-project/pull/144327
More information about the cfe-commits
mailing list