diff options
author | David Malcolm <dmalcolm@redhat.com> | 2022-10-07 12:41:59 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2022-10-07 12:41:59 -0400 |
commit | f09b99550a3c6cd16f5e9150ebd4b1d87033dcbd (patch) | |
tree | 5dfa5182f6242910eb9770406e78020e5cdd534b /gcc/testsuite | |
parent | eb491ea5c10955c667ceeda76dede393c93a377b (diff) | |
download | gcc-f09b99550a3c6cd16f5e9150ebd4b1d87033dcbd.zip gcc-f09b99550a3c6cd16f5e9150ebd4b1d87033dcbd.tar.gz gcc-f09b99550a3c6cd16f5e9150ebd4b1d87033dcbd.tar.bz2 |
analyzer: extract bits from integer constants [PR105783]
Fix a false positive from -Wanalyzer-null-dereference due to -fanalyzer
failing to grok the value of a particular boolean field initialized to a
constant.
gcc/analyzer/ChangeLog:
PR analyzer/105783
* region-model.cc (selftest::get_bit): New function.
(selftest::test_bits_within_svalue_folding): New.
(selfftest::analyzer_region_model_cc_tests): Call it.
* svalue.cc (constant_svalue::maybe_fold_bits_within): Handle the
case of extracting a single bit.
gcc/testsuite/ChangeLog:
PR analyzer/105783
* gcc.dg/analyzer/pr105783.c: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr105783.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr105783.c b/gcc/testsuite/gcc.dg/analyzer/pr105783.c new file mode 100644 index 0000000..00f44d0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr105783.c @@ -0,0 +1,26 @@ +/* { dg-additional-options "-O" } */ + +struct ss_s { + union out_or_counting_u { + char *newstr; + unsigned long long cnt; + } uu; + _Bool counting; +}; + +struct ss_s ss_init(void) { + struct ss_s rr = { .counting = 1 }; + return rr; +} + +void ss_out(struct ss_s *t, char cc) { + if (!t->counting) { + *t->uu.newstr++ = cc; + } +} + +int main() { + struct ss_s ss = ss_init(); + ss_out(&ss, 'a'); +} + |