NagyDonat wrote:

:thinking: I agree that it wouldn't be elegant to add

> ```
> +  if (isa_and_nonnull<SymbolOverlyComplex>(lhs.getAsSymbol()) ||
> +      isa_and_nonnull<SymbolOverlyComplex>(rhs.getAsSymbol()))
> +    return UnknownVal();
> ```

because this way `SymbolOverlyComplex` would become an overcomplicated 
intermediate step that always leads to `UnknownVal`.

However, as I think about this situation, I realized that it's completely 
arbitrary that we're putting a complexity limit on the _result_ symbol -- we 
might as well introduce a complexity threshold above which symbols cannot 
_participate in calculations_:
```c++
if (lhs.getAsSymbol() && lhs.getAsSymbol()->complexity() > Threshold ||
    lhs.getAsSymbol() && lhs.getAsSymbol()->complexity() > Threshold)
  return UnknownVal();
```
This different sort of limitation still guarantees that we cannot build overly 
complex symbols, but its implementation is significantly shorter (just three 
early return statements for unary operator, binary operator and cast 
evaluation). 

:bulb: In fact, you can add the complexity values of the two operands to get a 
heuristic which is practically equivalent to the complexity threshold that you 
want, but doesn't pass around `UnknownVal`s in already complex code and doesn't 
introduce a new symbol type.

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

Reply via email to