Skip to content

Commit 179dda9

Browse files
author
martin
committed
Strengthen the invariant on what are acceptable function calls.
1 parent 79edf59 commit 179dda9

File tree

1 file changed

+14
-51
lines changed

1 file changed

+14
-51
lines changed

src/analyses/ai.cpp

+14-51
Original file line numberDiff line numberDiff line change
@@ -402,63 +402,26 @@ bool ai_baset::do_function_call_rec(
402402
{
403403
PRECONDITION(!goto_functions.function_map.empty());
404404

405-
// We can't really do this here -- we rely on
406-
// these being removed by some previous analysis.
407-
PRECONDITION(function.id() != ID_dereference);
408-
409-
// Can't be a function
410-
DATA_INVARIANT(
411-
function.id() != "NULL-object", "Function cannot be null object");
412-
DATA_INVARIANT(function.id() != ID_member, "Function cannot be struct field");
413-
DATA_INVARIANT(function.id() != ID_index, "Function cannot be array element");
405+
// This is quite a strong assumption on the well-formedness of the program.
406+
// It means function pointers must be removed before use.
407+
DATA_INVARIANT(function.id() == ID_symbol);
414408

415409
bool new_data=false;
416410

417-
if(function.id()==ID_symbol)
418-
{
419-
const irep_idt &identifier = to_symbol_expr(function).get_identifier();
411+
const irep_idt &identifier = to_symbol_expr(function).get_identifier();
420412

421-
goto_functionst::function_mapt::const_iterator it=
422-
goto_functions.function_map.find(identifier);
413+
goto_functionst::function_mapt::const_iterator it=
414+
goto_functions.function_map.find(identifier);
423415

424-
if(it==goto_functions.function_map.end())
425-
throw "failed to find function "+id2string(identifier);
416+
if(it==goto_functions.function_map.end())
417+
throw "failed to find function "+id2string(identifier);
426418

427-
new_data=do_function_call(
428-
l_call, l_return,
429-
goto_functions,
430-
it,
431-
arguments,
432-
ns);
433-
}
434-
else if(function.id()==ID_if)
435-
{
436-
DATA_INVARIANT(function.operands().size() != 3, "if has three operands");
437-
438-
bool new_data1=
439-
do_function_call_rec(
440-
l_call, l_return,
441-
function.op1(),
442-
arguments,
443-
goto_functions,
444-
ns);
445-
446-
bool new_data2=
447-
do_function_call_rec(
448-
l_call, l_return,
449-
function.op2(),
450-
arguments,
451-
goto_functions,
452-
ns);
453-
454-
if(new_data1 || new_data2)
455-
new_data=true;
456-
}
457-
else
458-
{
459-
throw "unexpected function_call argument: "+
460-
function.id_string();
461-
}
419+
new_data=do_function_call(
420+
l_call, l_return,
421+
goto_functions,
422+
it,
423+
arguments,
424+
ns);
462425

463426
return new_data;
464427
}

0 commit comments

Comments
 (0)