analyzer: fix ICE on bogus decl of memset [PR97130]
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 21 Sep 2020 15:59:26 +0000 (11:59 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Mon, 21 Sep 2020 22:50:08 +0000 (18:50 -0400)
Verify that arguments are pointers before calling handling code
that calls deref_rvalue on them.

gcc/analyzer/ChangeLog:
PR analyzer/97130
* region-model-impl-calls.cc (call_details::get_arg_type): New.
* region-model.cc (region_model::on_call_pre): Check that the
initial arg is a pointer before calling impl_call_memset and
impl_call_strlen.
* region-model.h (call_details::get_arg_type): New decl.

gcc/testsuite/ChangeLog:
PR analyzer/97130
* gcc.dg/analyzer/pr97130.c: New test.

gcc/analyzer/region-model-impl-calls.cc
gcc/analyzer/region-model.cc
gcc/analyzer/region-model.h
gcc/testsuite/gcc.dg/analyzer/pr97130.c [new file with mode: 0644]

index 6582ffb3c9575cbcf6e79a443a7bbcc480019cc2..423f74a415261958c391a294b47b97cc8655b399 100644 (file)
@@ -103,6 +103,14 @@ call_details::get_arg_tree (unsigned idx) const
   return gimple_call_arg (m_call, idx);
 }
 
+/* Get the type of argument IDX.  */
+
+tree
+call_details::get_arg_type (unsigned idx) const
+{
+  return TREE_TYPE (gimple_call_arg (m_call, idx));
+}
+
 /* Get argument IDX at the callsite as an svalue.  */
 
 const svalue *
index 1312391557db57a9da891aa7d950100f9876b7e5..6f04904a74e2fd774bd141eecdae671a0c8c7fed 100644 (file)
@@ -737,12 +737,14 @@ region_model::on_call_pre (const gcall *call, region_model_context *ctxt)
          /* No side-effects (tracking stream state is out-of-scope
             for the analyzer).  */
        }
-      else if (is_named_call_p (callee_fndecl, "memset", call, 3))
+      else if (is_named_call_p (callee_fndecl, "memset", call, 3)
+              && POINTER_TYPE_P (cd.get_arg_type (0)))
        {
          impl_call_memset (cd);
          return false;
        }
-      else if (is_named_call_p (callee_fndecl, "strlen", call, 1))
+      else if (is_named_call_p (callee_fndecl, "strlen", call, 1)
+              && POINTER_TYPE_P (cd.get_arg_type (0)))
        {
          if (impl_call_strlen (cd))
            return false;
index 1bb9798ae58d08427724feda13cdede9241f2a69..4859df369cf90f3a305a8201086694397e5c9f56 100644 (file)
@@ -2482,6 +2482,7 @@ public:
   bool maybe_set_lhs (const svalue *result) const;
 
   tree get_arg_tree (unsigned idx) const;
+  tree get_arg_type (unsigned idx) const;
   const svalue *get_arg_svalue (unsigned idx) const;
 
   void dump_to_pp (pretty_printer *pp, bool simple) const;
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr97130.c b/gcc/testsuite/gcc.dg/analyzer/pr97130.c
new file mode 100644 (file)
index 0000000..f437b76
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-additional-options "-Wno-builtin-declaration-mismatch" } */
+
+void *
+memset (int, int, __SIZE_TYPE__);
+
+void
+mp (int xl)
+{
+  memset (xl, 0, sizeof xl);
+}