analyzer: stop -ftrivial-auto-var-init from suppressing uninit warnings [PR104270]
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 28 Jan 2022 16:02:09 +0000 (11:02 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Wed, 2 Feb 2022 14:51:07 +0000 (09:51 -0500)
commit9b4eee5fd158c4ee75d1f1000debbf5082fb9b56
tree525c279dd4a7ca0dffb3f70bd2af9b3857912289
parentcac2f69cdad434ad5cb60f5fe931d45cd82ef476
analyzer: stop -ftrivial-auto-var-init from suppressing uninit warnings [PR104270]

GCC 12 has gained two features for dealing with uninitialized variables:

(a) a new -Wanalyzer-use-of-uninitialized-value warning within -fanalyzer
for interprocedural path-sensitive detection of ununit uses, and

(b) a new -ftrivial-auto-var-init option for mitigating some uses of
uninit variables

It turns out that using (b) was thwarting (a), as it led to -fanalyzer
seeing calls to IFN_DEFERRED_INIT, which -fanalyzer wasn't
special-casing, thus treating it as initializing the variables in
question, and thus silencing -Wanalyzer-use-of-uninitialized-value on
them.

invoke.texi says:

"GCC still considers an automatic variable that doesn't have an explicit
initializer as uninitialized, @option{-Wuninitialized} will still report
warning messages on such automatic variables."

and thus -Wanalyzer-use-of-uninitialized-value ought to as well.

This patch adds special-case handling to -fanalyzer for
IFN_DEFERRED_INIT,  so that -fanalyzer will warn on uninit uses of
variables that are mitigated by -ftrivial-auto-var-init.

gcc/analyzer/ChangeLog:
PR analyzer/104270
* region-model.cc (region_model::on_call_pre): Handle
IFN_DEFERRED_INIT.

gcc/testsuite/ChangeLog:
PR analyzer/104270
* gcc.dg/analyzer/uninit-trivial-auto-var-init-pattern.c: New
test.
* gcc.dg/analyzer/uninit-trivial-auto-var-init-uninitialized.c:
New test.
* gcc.dg/analyzer/uninit-trivial-auto-var-init-zero.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/analyzer/region-model.cc
gcc/testsuite/gcc.dg/analyzer/uninit-trivial-auto-var-init-pattern.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/analyzer/uninit-trivial-auto-var-init-uninitialized.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/analyzer/uninit-trivial-auto-var-init-zero.c [new file with mode: 0644]