[cfe-dev] Newby SA question

Sergei Larin via cfe-dev cfe-dev at lists.llvm.org
Wed Oct 10 12:37:12 PDT 2018


Hello,

  I have (unexpectedly) found myself developing a specific SA checker, and during the process I run across an interesting observation.

1) The checker traces zero value passed to a specific function. That is not that important, but I based my implementation on zero arguments passed to memcpy/memset checker. Simple enough.
2) I realized that the path from function arguments to the checked function matters. Here is an example:

void test (unsigned short *, unsigned, unsigned);

void foo(const float aa[], unsigned short bb[], unsigned int cc)
{
  unsigned char dd;
  float ee = 0.f;
  for (dd = 0; dd < cc; dd++)
    ee += aa[dd];

  if (ee == 0.f)
    test(bb, 99, cc);
}


void bar(const float aa[], unsigned short bb[], unsigned int cc, unsigned int xx)
{
  unsigned char dd;
  float ee = 0.f;
  for (dd = 0; dd < cc; dd++)
    ee += aa[dd];

  if (ee == 0.f)
    test(bb, 99, xx);
}

In function foo arg cc passed to test() is SVal (0 U32b) (among other values) so my checker is triggered.
In function bar arg xx is SVal (reg_$2<unsigned int xx>) which does _not_ match zero check.

The reason for that, as far as I can read from the code, is the for() loop. In foo cc is used in (dd<cc) inequality, and value for it is estimated with a range(reg_$0<unsigned int cc> : { [0, 0] }) which at the point my checker run for test() is re-interpreted as known value of zero.

3) From #2 I can make a conclusion that presence of comparison (dd<cc above) alters analysis in a substantial way.

Now the question - is this expected behavior or a bug? If this is expected behavior is there a way to affect it with any options already available? If this is a bug, is there a mechanism to "flush" state after analysis of the for loop is over, and I want to run value estimator at the point of test() evaluation from scratch? Is there a better way to achieve determinism?


...or I simply do not know what I am talking about 😊  

Any feedback is highly appreciated. Thank you.

Sergei

--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.




More information about the cfe-dev mailing list