aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2024-03-27 18:26:51 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2024-03-27 18:26:51 -0400
commitfdd59818e2abf6043f4d45aeb157e95956c71088 (patch)
treebd79c8d9da3e4b0fae6c44766e16c4f670db2ca9 /gcc/analyzer
parentf89c83aa139521804241d21e006557ac5a421f51 (diff)
downloadgcc-fdd59818e2abf6043f4d45aeb157e95956c71088.zip
gcc-fdd59818e2abf6043f4d45aeb157e95956c71088.tar.gz
gcc-fdd59818e2abf6043f4d45aeb157e95956c71088.tar.bz2
analyzer: fix ICE due to type mismatch when replaying call summary [PR114473]
gcc/analyzer/ChangeLog: PR analyzer/114473 * call-summary.cc (call_summary_replay::convert_svalue_from_summary): Assert that the types match. (call_summary_replay::convert_region_from_summary): Likewise. (call_summary_replay::convert_region_from_summary_1): Add missing cast for the deref of RK_SYMBOLIC case. gcc/testsuite/ChangeLog: PR analyzer/114473 * gcc.dg/analyzer/call-summaries-pr114473.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc/analyzer')
-rw-r--r--gcc/analyzer/call-summary.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/analyzer/call-summary.cc b/gcc/analyzer/call-summary.cc
index a569bb9..c2c9c71 100644
--- a/gcc/analyzer/call-summary.cc
+++ b/gcc/analyzer/call-summary.cc
@@ -235,6 +235,11 @@ call_summary_replay::convert_svalue_from_summary (const svalue *summary_sval)
const svalue *caller_sval = convert_svalue_from_summary_1 (summary_sval);
+ if (caller_sval)
+ if (summary_sval->get_type () && caller_sval->get_type ())
+ gcc_assert (types_compatible_p (summary_sval->get_type (),
+ caller_sval->get_type ()));
+
/* Add to cache. */
add_svalue_mapping (summary_sval, caller_sval);
@@ -552,6 +557,11 @@ call_summary_replay::convert_region_from_summary (const region *summary_reg)
const region *caller_reg = convert_region_from_summary_1 (summary_reg);
+ if (caller_reg)
+ if (summary_reg->get_type () && caller_reg->get_type ())
+ gcc_assert (types_compatible_p (summary_reg->get_type (),
+ caller_reg->get_type ()));
+
/* Add to cache. */
add_region_mapping (summary_reg, caller_reg);
@@ -603,6 +613,8 @@ call_summary_replay::convert_region_from_summary_1 (const region *summary_reg)
= get_caller_model ()->deref_rvalue (caller_ptr_sval,
NULL_TREE,
get_ctxt ());
+ caller_reg = mgr->get_cast_region (caller_reg,
+ summary_reg->get_type ());
return caller_reg;
}
break;