@@ -649,8 +649,16 @@ void code_contractst::instrument_call_statement(
649
649
" a function call" );
650
650
651
651
code_function_callt call = instruction_iterator->get_function_call ();
652
- const irep_idt &called_name =
653
- to_symbol_expr (call.function ()).get_identifier ();
652
+ irep_idt called_name;
653
+ if (call.function ().id () == ID_dereference)
654
+ {
655
+ called_name = to_symbol_expr (to_dereference_expr (call.function ()).pointer ())
656
+ .get_identifier ();
657
+ }
658
+ else
659
+ {
660
+ called_name = to_symbol_expr (call.function ()).get_identifier ();
661
+ }
654
662
655
663
if (called_name == " malloc" )
656
664
{
@@ -699,12 +707,15 @@ void code_contractst::instrument_call_statement(
699
707
++instruction_iterator;
700
708
}
701
709
702
- PRECONDITION (call.function ().id () == ID_symbol);
703
710
const symbolt &called_symbol = ns.lookup (called_name);
704
- const code_typet &called_type = to_code_type (called_symbol.type );
705
-
711
+ // Called symbol might be a function pointer.
712
+ const typet &called_symbol_type = (called_symbol.type .id () == ID_pointer)
713
+ ? called_symbol.type .subtype ()
714
+ : called_symbol.type ;
706
715
exprt called_assigns =
707
- to_code_with_contract_type (called_symbol.type ).assigns ();
716
+ to_code_with_contract_type (called_symbol_type).assigns ();
717
+ const code_typet &called_type = to_code_type (called_symbol_type);
718
+
708
719
if (called_assigns.is_not_nil ())
709
720
{
710
721
replace_symbolt replace_formal_params;
@@ -753,8 +764,17 @@ bool code_contractst::check_for_looped_mallocs(const goto_programt &program)
753
764
if (instruction.is_function_call ())
754
765
{
755
766
code_function_callt call = instruction.get_function_call ();
756
- const irep_idt &called_name =
757
- to_symbol_expr (call.function ()).get_identifier ();
767
+ irep_idt called_name;
768
+ if (call.function ().id () == ID_dereference)
769
+ {
770
+ called_name =
771
+ to_symbol_expr (to_dereference_expr (call.function ()).pointer ())
772
+ .get_identifier ();
773
+ }
774
+ else
775
+ {
776
+ called_name = to_symbol_expr (call.function ()).get_identifier ();
777
+ }
758
778
759
779
if (called_name == " malloc" )
760
780
{
0 commit comments