[cfe-dev] [analyzer] RFC, garbage value => out of bounds

Artem Dergachev via cfe-dev cfe-dev at lists.llvm.org
Mon Mar 14 08:20:44 PDT 2016


The problem that nr has not been proven to be greater than 2 was already 
covered by Joerg; it's worth it to have a look at the html diagnostic 
for the original case to see if it was proven that such caller context 
exists, otherwise we shouldn't ideally be seeing this warning. In fact, 
probably a heuristic based on detecting 
SymbolRegionValue<VarRegoin{ParmVarDecl}>-like values and staying more 
conservative with them than with other values may work somehow, not sure.

 > the a[i] value is not undefined when i is out of bounds.

Out of bounds access causes undefined behavior. In practice, the program 
either crashes or produces an undefined value. I agree that the term 
"uninitialized" may not quite make sense here though.

The analyzer ideally should stop analysis of the branch (in this example 
there's only one branch, so the whole analysis interrupts) after 
undefined behavior occurs - which is what enabling array bounds checker 
should cause. Because array bounds checker is alpha (not sure why), the 
analysis continues, modeling the undefined value read by a pointer to 
perfectly defined array (which doesn't make the value, say, a[2] 
defined) with an undefined symbolic-value marker (UndefinedVal), and 
then another checker warns on usage of such undefined value.

So the problem we run into here is that the original message is much 
clearer in a simple case of:

   void foo() {
     int n;
     bar(n) // Function call argument is an uninitialized value
   }

In this example i'd certainly prefer "uninitialized" over "undefined". 
In your example, i'd probably prefer "undefined", and certainly prefer a 
significantly different warning, such as "Function call argument is a 
garbage value [obtained from an out-of-bound array access]". 
Unfortunately, discriminating between these two cases is right now 
technically difficult (the signleton UndefinedVal object does not 
provide any origin information). Then, again, we should not have seen 
this warning, because due to undefined behavior the execution shouldn't 
reach here anyway.

And i guess that there aren't many places when you can obtain undefined 
values without first causing undefined behavior. Uninitialized values 
are certainly one of such rare places. Though better warnings would be 
great anyway.

Maybe it's worth it to turn UndefinedVal into a true symbol in order to 
properly track its origin?


More information about the cfe-dev mailing list