https://github.com/NagyDonat requested changes to this pull request.

Thanks for investing work into this checker, but unfortunatel – as @haoNoQ also 
explained –, the suggested changes are incompatible with the principle that the 
analyzer must assume the best about things that it doesn't understand (e.g. if 
it cannot prove that an index cannot be in bounds, then it must assume that the 
index is in bounds).

This principle is important because the analyzer only sees and understands 
small fragments of the code: the simulated execution starts from arbitrarily 
picked functions (because it cannot reach everything from `main()`) and it is 
common that the analyzer doesn't see what happens inside function calls 
(because the definition is unavailable or the recursion/work limits are 
exceeded).

With the changes that you propose, the analyzer would flood the user with heaps 
of false positive warnings, because even if the programmer does perfect bounds 
checking, there would be many situations where the analyzer _doesn't see_ these 
bounds checks and (with your aggressive logic) reports an error.

For example in code like
```c++
bool index_in_bounds(int, size_t); // defined in different TU
int foo(int idx) {
  if (index_in_bounds(idx, ARRAY_SIZE)) {
    return array[idx];
  }
  return -1;
}
```
the analyzer with your patch would produce a false positive because (by 
default) it cannot look at the definition of `index_in_bounds` and determine 
that it does proper bounds checking.

The selection of the entrypoint can also be problematic, for example in a 
situation like
```c++
double get_value(int idx) {
  if (idx < 0 || idx > NUM_VALUES)
     return 0.0
  return get_value_impl(idx);
//... in a different file
double get_value_impl(int idx) {
  return array[idx];
}
```
the analyzer can select `get_value_impl` as an entrypoint -- and with your 
patch it would be reported as out-of-bounds access even if `get_value_impl` is 
only called from `get_value` (and other functions that do proper bounds 
checking).

The taint handling is a special case, because the fact that the analyzer sees 
the taint implies that it was able to follow that value from a taint source 
(e.g. user input, that can produce arbitrary values) to the array indexing -- 
and didn't see proper bounds checking along the way. Despite this, the taint 
checkers are an `optin` feature of the analyzer because their noisiness may be 
too much for some users.

I can understand that some users would like to have more aggressive warnings 
about unchecked array access, and perhaps your changes could be included as an 
off-by-default option that can be enabled by those users. However, even in this 
case you should try out your code on several real-world projects (e.g. stable 
open source code) because I fear that it may produce so many false positives 
that it would be useless in practice.

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

Reply via email to