aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer/ChangeLog
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-03-26 09:42:25 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-03-27 10:04:57 -0400
commit6969ac301f2229366a812942a906257e5c060762 (patch)
treecb6843707780950674bcdfd10f4db886d4e0e70d /gcc/analyzer/ChangeLog
parent42c633132521c8c2874cef54852090d587ce66c3 (diff)
analyzer: fix malloc pointer NULL-ness
Fixes to exploded_path::feasible_p exposed a pre-existing bug with pointer NULL-ness for pointers to symbolic_region. symbolic_region has an "m_possibly_null" flag which if set means that a region_svalue pointing to that region is treated as possibly NULL. Adding a constraint of "!= NULL" on an edge records that the pointer is non-NULL, but doesn't affect other pointers (e.g. if the first if a void *, but the other pointers are cast to other pointer types). This showed up in the tests gcc.dg/analyzer/data-model-5b.c and -5c.c, which malloc a buffer and test for NULL, but then cast that to a struct * and later test that struct *: a path for the first test being non-NULL and the second being NULL was erroneously found to be feasible. This patch clears the m_possibly_null flag when a "!= NULL" constraint is added, fixing that erroneous path (but not yet fixing the false positive in the above tests, which seems to go on to hit a different issue). It also adds the field to dumps. gcc/analyzer/ChangeLog: * program-state.cc (selftest::test_program_state_dumping): Update expected dump to include symbolic_region's possibly_null field. * region-model.cc (symbolic_region::print_fields): New vfunc implementation. (region_model::add_constraint): Clear m_possibly_null from symbolic_regions now known to be non-NULL. (selftest::test_malloc_constraints): New selftest. (selftest::analyzer_region_model_cc_tests): Call it. * region-model.h (region::dyn_cast_symbolic_region): Add non-const overload. (symbolic_region::dyn_cast_symbolic_region): Implement it. (symbolic_region::print_fields): New vfunc override decl. gcc/testsuite/ChangeLog: * gcc.dg/analyzer/data-model-5b.c: Add xfail for new false positive leak. * gcc.dg/analyzer/data-model-5c.c: Likewise. * gcc.dg/analyzer/malloc-5.c: New test.
Diffstat (limited to 'gcc/analyzer/ChangeLog')
-rw-r--r--gcc/analyzer/ChangeLog15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog
index ddb02afe192..98093cd4f35 100644
--- a/gcc/analyzer/ChangeLog
+++ b/gcc/analyzer/ChangeLog
@@ -1,5 +1,20 @@
2020-03-27 David Malcolm <dmalcolm@redhat.com>
+ * program-state.cc (selftest::test_program_state_dumping): Update
+ expected dump to include symbolic_region's possibly_null field.
+ * region-model.cc (symbolic_region::print_fields): New vfunc
+ implementation.
+ (region_model::add_constraint): Clear m_possibly_null from
+ symbolic_regions now known to be non-NULL.
+ (selftest::test_malloc_constraints): New selftest.
+ (selftest::analyzer_region_model_cc_tests): Call it.
+ * region-model.h (region::dyn_cast_symbolic_region): Add non-const
+ overload.
+ (symbolic_region::dyn_cast_symbolic_region): Implement it.
+ (symbolic_region::print_fields): New vfunc override decl.
+
+2020-03-27 David Malcolm <dmalcolm@redhat.com>
+
* analyzer.h (class feasibility_problem): New forward decl.
* diagnostic-manager.cc (saved_diagnostic::saved_diagnostic):
Initialize new fields m_status, m_epath_length, and m_problem.