<div dir="ltr"><div>Hello,</div><div><br></div>I am trying to write a very simple checker for the clang static analyzer for the sake of writing a first exercise on this topic. Its goal is to simply alert whether a specific function has been called twice in a given path. Let's assume the name of this specific function that I am tracking is "doNotCallTwice()".<div>
<br></div><div>In order to record state information, I use the REGISTER_TRAIT_WITH_PROGRAMSTATE macro to register an unsigned together with the program state. This integer indicates whether the function "doNotCallTwice()" has been called in a path and, if it is equal to 1 in a node where I detect yet another call, I prepare to report a "double call" bug. I use "checkPostCall" for changing the state.<br>
<br>However, something strange happens. My extra integer registered in the program state is not sufficient to differentiate two ProgramStates with the same ProgramPoint: the engine fold the two nodes anyway, ignoring my new state information. On the other hand, the information *is* propagated. If I use other ways to avoid the nodes being folded, the checker works fine.<br>
<br>An example where it does not work:<br><br>void myfunc (int x, int y) {<br>  if (x)</div><div>    doNotCallTwice();</div><div>  if (y)</div><div>    doNotCallTwice();</div><div>  doNotCallTwice();<br>}</div><div><br></div>
<div>Since programstates get folded in the ExplodedGraph, I never detect any path where two calls to doNotCallTwice() happen. However, change the code in the following way avoids the folding and make my checker work:</div>
<div><br></div><div><div>void myfunc (int x, int y) {<br>  if (x)</div><div>    doNotCallTwice();</div><div>  if (y)</div><div>    doNotCallTwice();</div><div>  y = x;  // Now x and y are not dead anymore and this won't be folded</div>
<div>  doNotCallTwice();<br>}</div><br>I based my checker on SimpleStreamChecker.cpp. Am I doing something conceptually wrong?</div><div><br></div><div>Best regards,</div><div>Rafael</div></div>