necto wrote:

While you are thinking about it, here is a bug I discovered when enabled 
`aggressive-binary-operation-simplification` on our test suite:

```
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \
// RUN:   -analyzer-config aggressive-binary-operation-simplification=true \
// RUN:   -analyzer-config eagerly-assume=false \
// RUN:   -verify=rearrange %s

// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \
// RUN:   -analyzer-config aggressive-binary-operation-simplification=false \
// RUN:   -analyzer-config eagerly-assume=false \
// RUN:   -verify=no-rearrange %s

// tryRearrange decomposes both operands into "$x + n" and "$x + m". When the
// two symbols are the same, it folds just the constants, which is only right
// for comparisons and subtraction: "($x + n) + ($x + m)" is "2 * $x + n + m",
// not "n + m".

void clang_analyzer_eval(int);
int f(void);

void add_shifted_same_symbol(void) {
  int x = f();
  clang_analyzer_eval((x + 1) + (x + 2) == 3); // 
no-rearrange-warning{{UNKNOWN}} rearrange-warning{{TRUE}}
  clang_analyzer_eval((x + 1) + x == 1);       // 
no-rearrange-warning{{UNKNOWN}} rearrange-warning{{TRUE}}
  clang_analyzer_eval((x - 1) + (x + 1) == 0); // 
no-rearrange-warning{{UNKNOWN}} rearrange-warning{{TRUE}}
}

void add_shifted_same_symbol_constrained(void) {
  int x = f();
  if (x < 1 || x > 1000)
    return;
  // 2 * x + 1 is in [3, 2001].
  clang_analyzer_eval((x + 1) + x == 1); // no-rearrange-warning{{FALSE}} 
rearrange-warning{{TRUE}}
  clang_analyzer_eval((x + 1) + x > 2);  // no-rearrange-warning{{TRUE}} 
rearrange-warning{{FALSE}}
}
```
In case that helps you come up with a more efficient and more correct 
implementation.

https://github.com/llvm/llvm-project/pull/236565
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to