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:
parent
69b66ff023
commit
7d8f4240c9
3 changed files with 6 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
3
gcc/testsuite/gcc.dg/analyzer/pr99906.c
Normal file
3
gcc/testsuite/gcc.dg/analyzer/pr99906.c
Normal file
|
@ -0,0 +1,3 @@
|
|||
void bar(void *) __attribute__((__nonnull__));
|
||||
void *baz(void);
|
||||
void foo(void) { bar(baz()); }
|
Loading…
Add table
Reference in a new issue