analyzer: fix ICE on zero-arg calls passed to __attribute__((nonnull)) [PR 99906]

gcc/analyzer/ChangeLog:
	PR analyzer/99906
	* analyzer.cc (maybe_reconstruct_from_def_stmt): Fix NULL
	dereference on calls with zero arguments.
	* sm-malloc.cc (malloc_state_machine::on_stmt): When handling
	__attribute__((nonnull)), only call get_diagnostic_tree if the
	result will be used.

gcc/testsuite/ChangeLog:
	PR analyzer/99906
	* gcc.dg/analyzer/pr99906.c: New test.
This commit is contained in:
David Malcolm 2021-04-05 10:51:46 -04:00
parent 69b66ff023
commit 7d8f4240c9
3 changed files with 6 additions and 2 deletions

View File

@ -148,7 +148,7 @@ maybe_reconstruct_from_def_stmt (tree ssa_name,
}
return build_call_array_loc (gimple_location (call_stmt),
return_type, fn,
num_args, &args[0]);
num_args, args.address ());
}
break;
}

View File

@ -1600,11 +1600,11 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
if (bitmap_empty_p (nonnull_args)
|| bitmap_bit_p (nonnull_args, i))
{
tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
state_t state = sm_ctxt->get_state (stmt, arg);
/* Can't use a switch as the states are non-const. */
if (unchecked_p (state))
{
tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
sm_ctxt->warn (node, stmt, arg,
new possible_null_arg (*this, diag_arg,
callee_fndecl,
@ -1616,6 +1616,7 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
}
else if (state == m_null)
{
tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
sm_ctxt->warn (node, stmt, arg,
new null_arg (*this, diag_arg,
callee_fndecl, i));

View File

@ -0,0 +1,3 @@
void bar(void *) __attribute__((__nonnull__));
void *baz(void);
void foo(void) { bar(baz()); }