analyzer: fix ICE on non-pointer longjmp [PR97233]
gcc/analyzer/ChangeLog: PR analyzer/97233 * analyzer.cc (is_longjmp_call_p): Require the initial argument to be a pointer. * engine.cc (exploded_node::on_longjmp): Likewise. gcc/testsuite/ChangeLog: PR analyzer/97233 * gcc.dg/analyzer/pr97233.c: New test.
This commit is contained in:
parent
53d28fd4e1
commit
01eabbeadb
@ -218,7 +218,10 @@ is_longjmp_call_p (const gcall *call)
|
||||
{
|
||||
if (is_special_named_call_p (call, "longjmp", 2)
|
||||
|| is_special_named_call_p (call, "siglongjmp", 2))
|
||||
return true;
|
||||
/* exploded_node::on_longjmp requires a pointer for the initial
|
||||
argument. */
|
||||
if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (call, 0))))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1277,6 +1277,7 @@ exploded_node::on_longjmp (exploded_graph &eg,
|
||||
region_model_context *ctxt) const
|
||||
{
|
||||
tree buf_ptr = gimple_call_arg (longjmp_call, 0);
|
||||
gcc_assert (POINTER_TYPE_P (TREE_TYPE (buf_ptr)));
|
||||
|
||||
region_model *new_region_model = new_state->m_region_model;
|
||||
const svalue *buf_ptr_sval = new_region_model->get_rvalue (buf_ptr, ctxt);
|
||||
|
8
gcc/testsuite/gcc.dg/analyzer/pr97233.c
Normal file
8
gcc/testsuite/gcc.dg/analyzer/pr97233.c
Normal file
@ -0,0 +1,8 @@
|
||||
void
|
||||
longjmp (__SIZE_TYPE__, int);
|
||||
|
||||
void
|
||||
e7 (__SIZE_TYPE__ gr)
|
||||
{
|
||||
longjmp (gr, 1);
|
||||
}
|
Loading…
Reference in New Issue
Block a user