[PATCH] D46415: [analyzer] pr36458: Fix retrieved value cast for symbolic void pointers.

Domján Dániel via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat May 20 14:23:47 PDT 2023


isuckatcs added inline comments.
Herald added subscribers: steakhal, manas, ASDenysPetrov, martong, dkrupp, donat.nagy, Szelethus, mikhail.ramalho.
Herald added a project: All.


================
Comment at: test/Analysis/casts.c:166
+  *x = 1;
+  clang_analyzer_eval(u == 1); // expected-warning{{TRUE}}
+}
----------------
@NoQ why is this true for both x86_64 and i386? 

On x86_64 `sizeof(int *) == 8` and `sizeof(int) == 4`. This means that `(*((int *)(&x))) = (int)&u;` writes to the lower 4 bytes of `x` and leaves the upper 4 bytes uninitialized. See this [[ https://godbolt.org/z/E6ocPE9Gr | godbolt example ]]. If I compile and run this function on my machine it segfaults.

On i386 `sizeof(int *) == 4` and `sizeof(int) == 4`, so on that platform this example is correct. See on [[https://godbolt.org/z/GaW73Wod7 | godbolt]].

In the x86_64 case don't we want the analyzer to report a warning a instead, as on that platform `u` is only partially initialized?


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D46415/new/

https://reviews.llvm.org/D46415



More information about the cfe-commits mailing list