[cfe-dev] clang and clang-sa do not detect uninitialized variable

Nathan Sidwell via cfe-dev cfe-dev at lists.llvm.org
Fri Apr 30 05:59:31 PDT 2021


On 4/29/21 4:41 PM, Ali Shuja Siddiqui (alissidd) via cfe-dev wrote:
> Hello,
> 
> With the following code
> 
> //-------------------------
> 
> #include <stdio.h>
> 
> extern int t;
> 
> void use_b (int *b){
> 
>      printf("%p\n",b);
> 
> }
> 
> void func(){
> 
>      int b;
> 
>      use_b(&b);
> 
>      if (b)
> 
>          b+=33;
> 
> }
> 
> //---------------------------
> 
> Running clang -Wuninitialized or running clang –analyze, I don’t see any 
> warning for uninitialized variables. However, if I change the code to:
> 
> //----------------------
> 
> #include <stdio.h>
> 
> extern int t;
> 
> void use_b (int *b){
> 
>      if (t==5)
> 
>          return;
> 
>      printf("%p\n",b);
> 
> }
> 
> void func(){
> 
>      int b;
> 
>      use_b(&b);
> 
>      if (b)
> 
>          b+=33;
> 
> }
> 
> //--------------------
> 
> I do see this warning with the static analyzer:
> 
> sa_try.c:13:9: warning: Branch condition evaluates to a garbage value 
> [core.uninitialized.Branch]
> 
>      if (b)
> 
>          ^
> 
> 1 warning generated.
> 
> My question is why am I not getting any warning for the first case? Is 
> it being considered that printf is updating the value of b in some way?

Presuming it has no knowledge of printf's semantics, then yes.  that 
function could write through the pointer (and indeed would, if 'b' was 
an output parameter).

It could learn that printf doesn't do that (except for %n).

nathan


nathan
-- 
Nathan Sidwell


More information about the cfe-dev mailing list