ipa/105166 - avoid modref queries with mismatching types
authorRichard Biener <rguenther@suse.de>
Wed, 6 Apr 2022 08:40:06 +0000 (10:40 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 6 Apr 2022 10:23:17 +0000 (12:23 +0200)
We should avoid mismatched argument values (integers for pointers)
when doing modref queries.  This is the third place to guard.

2022-04-06  Richard Biener  <rguenther@suse.de>

PR ipa/105166
* ipa-modref-tree.cc (modref_access_node::get_ao_ref ): Bail
out for non-pointer arguments.

* gcc.dg/torture/pr105166.c: New testcase.

gcc/ipa-modref-tree.cc
gcc/testsuite/gcc.dg/torture/pr105166.c [new file with mode: 0644]

index d0ec2fb..f19af8c 100644 (file)
@@ -678,7 +678,9 @@ modref_access_node::get_ao_ref (const gcall *stmt, ao_ref *ref) const
 {
   tree arg;
 
-  if (!parm_offset_known || !(arg = get_call_arg (stmt)))
+  if (!parm_offset_known
+      || !(arg = get_call_arg (stmt))
+      || !POINTER_TYPE_P (TREE_TYPE (arg)))
     return false;
   poly_offset_int off = (poly_offset_int)offset
        + ((poly_offset_int)parm_offset << LOG2_BITS_PER_UNIT);
diff --git a/gcc/testsuite/gcc.dg/torture/pr105166.c b/gcc/testsuite/gcc.dg/torture/pr105166.c
new file mode 100644 (file)
index 0000000..60e8b73
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+int bar (foo, a)
+  int (**foo) ();
+  int a;
+{
+  (foo)[1] = bar;
+  foo[1] (1);
+}