diff options
author | David Malcolm <dmalcolm@redhat.com> | 2022-07-26 17:17:18 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2022-07-26 17:17:18 -0400 |
commit | db613e8fa841259f74740665ee9e508bd73ea1c4 (patch) | |
tree | c7b4d5df87043cd0f9e87eaacd679efd9ad93ed9 /gcc | |
parent | 0460ba622e833db5cc1cc793201762bbbd30af6b (diff) | |
download | gcc-db613e8fa841259f74740665ee9e508bd73ea1c4.zip gcc-db613e8fa841259f74740665ee9e508bd73ea1c4.tar.gz gcc-db613e8fa841259f74740665ee9e508bd73ea1c4.tar.bz2 |
analyzer: fix false +ves from -Wanalyzer-va-arg-type-mismatch on int promotion [PR106319]
gcc/analyzer/ChangeLog:
PR analyzer/106319
* store.cc (store::set_value): Don't strip away casts if the
region has NULL type.
gcc/testsuite/ChangeLog:
PR analyzer/106319
* gcc.dg/analyzer/stdarg-types-3.c: New test.
* gcc.dg/analyzer/stdarg-types-4.c: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/analyzer/store.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/stdarg-types-3.c | 67 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/stdarg-types-4.c | 22 |
3 files changed, 92 insertions, 1 deletions
diff --git a/gcc/analyzer/store.cc b/gcc/analyzer/store.cc index 0b3fb37..46475f6 100644 --- a/gcc/analyzer/store.cc +++ b/gcc/analyzer/store.cc @@ -2445,7 +2445,9 @@ store::set_value (store_manager *mgr, const region *lhs_reg, remove_overlapping_bindings (mgr, lhs_reg, uncertainty); - rhs_sval = simplify_for_binding (rhs_sval); + if (lhs_reg->get_type ()) + rhs_sval = simplify_for_binding (rhs_sval); + /* ...but if we have no type for the region, retain any cast. */ const region *lhs_base_reg = lhs_reg->get_base_region (); binding_cluster *lhs_cluster; diff --git a/gcc/testsuite/gcc.dg/analyzer/stdarg-types-3.c b/gcc/testsuite/gcc.dg/analyzer/stdarg-types-3.c new file mode 100644 index 0000000..7351261 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/stdarg-types-3.c @@ -0,0 +1,67 @@ +static void __attribute__((noinline)) +__analyzer_consume_n_ints (int num, ...) +{ + __builtin_va_list ap; + __builtin_va_start (ap, num); + + int i, v; + for (i = 0; i < num; i++) + v = __builtin_va_arg (ap, int); + + __builtin_va_end (ap); +} + +void test_int (int x) +{ + __analyzer_consume_n_ints (1, x); +} + +void test_3_ints (int x, int y, int z) +{ + __analyzer_consume_n_ints (3, x, y, z); +} + +/* Verify that we don't complain about types that get promoted to int + at the variadic call. */ + +void test_short (short s) +{ + __analyzer_consume_n_ints (1, s); +} + +void test_ushort (unsigned short s) +{ + __analyzer_consume_n_ints (1, s); +} + +void test_schar (signed char ch) +{ + __analyzer_consume_n_ints (1, ch); +} + +void test_uchar (unsigned char ch) +{ + __analyzer_consume_n_ints (1, ch); +} + +struct ust +{ + int b0123 : 4; + int b4567 : 4; +}; + +void test_signed_bitfield (struct ust s) +{ + __analyzer_consume_n_ints (2, s.b0123, s.b4567); +} + +struct sst +{ + unsigned int b0123 : 4; + unsigned int b4567 : 4; +}; + +void test_unsigned_bitfield (struct sst s) +{ + __analyzer_consume_n_ints (2, s.b0123, s.b4567); +} diff --git a/gcc/testsuite/gcc.dg/analyzer/stdarg-types-4.c b/gcc/testsuite/gcc.dg/analyzer/stdarg-types-4.c new file mode 100644 index 0000000..920ecce --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/stdarg-types-4.c @@ -0,0 +1,22 @@ +static void __attribute__((noinline)) +__analyzer_consume_n_uints (int num, ...) +{ + __builtin_va_list ap; + __builtin_va_start (ap, num); + + int i, v; + for (i = 0; i < num; i++) + v = __builtin_va_arg (ap, unsigned int); + + __builtin_va_end (ap); +} + +void test_uint (unsigned int x) +{ + __analyzer_consume_n_uints (1, x); +} + +void test_3_uints (unsigned int x, unsigned int y, unsigned int z) +{ + __analyzer_consume_n_uints (3, x, y, z); +} |