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:
David Malcolm 2020-09-28 15:42:31 -04:00
parent 53d28fd4e1
commit 01eabbeadb
3 changed files with 13 additions and 1 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -0,0 +1,8 @@
void
longjmp (__SIZE_TYPE__, int);
void
e7 (__SIZE_TYPE__ gr)
{
longjmp (gr, 1);
}