@@ -22,6 +22,8 @@ Author: Peter Schrammel
22
22
23
23
#include " 2ls_parse_options.h"
24
24
25
+ #define NOT_MATH_FUN (call, fun ) call!=fun && call!=fun" f" && call!=fun" l"
26
+
25
27
void twols_parse_optionst::inline_main (goto_modelt &goto_model)
26
28
{
27
29
irep_idt start=goto_functionst::entry_point ();
@@ -678,9 +680,12 @@ void twols_parse_optionst::assert_no_unsupported_functions(
678
680
}
679
681
}
680
682
681
- // / Prevents usage of atexit function which is not supported, yet
682
- // / Must be called before inlining since it will lose the calls
683
- void twols_parse_optionst::assert_no_atexit (goto_modelt &goto_model)
683
+ // / Fail if the program contains a call to an unsupported function. These
684
+ // / include the atexit function and advanced math functions from math.h (
685
+ // / these are either not defined in CBMC at all, or defined very imprecisely,
686
+ // / e.g. the result of cos is in <-1, 1> without any further information).
687
+ // / Must be called before inlining since it will lose the calls.
688
+ void twols_parse_optionst::assert_no_unsupported_function_calls (goto_modelt &goto_model)
684
689
{
685
690
for (const auto &f_it : goto_model.goto_functions .function_map )
686
691
{
@@ -693,6 +698,23 @@ void twols_parse_optionst::assert_no_atexit(goto_modelt &goto_model)
693
698
continue ;
694
699
auto &name=id2string (to_symbol_expr (function).get_identifier ());
695
700
assert (name!=" atexit" );
701
+ assert (
702
+ // Trigonometry
703
+ NOT_MATH_FUN (name, " cos" ) && NOT_MATH_FUN (name, " acos" ) &&
704
+ NOT_MATH_FUN (name, " sin" ) && NOT_MATH_FUN (name, " asin" ) &&
705
+ NOT_MATH_FUN (name, " tan" ) && NOT_MATH_FUN (name, " atan" ) &&
706
+ NOT_MATH_FUN (name, " atan2" ) &&
707
+ // Hyperbolic
708
+ NOT_MATH_FUN (name, " cosh" ) && NOT_MATH_FUN (name, " acosh" ) &&
709
+ NOT_MATH_FUN (name, " sinh" ) && NOT_MATH_FUN (name, " asinh" ) &&
710
+ NOT_MATH_FUN (name, " tanh" ) && NOT_MATH_FUN (name, " atanh" ) &&
711
+ // Exponential
712
+ NOT_MATH_FUN (name, " exp" ) && NOT_MATH_FUN (name, " exp2" ) &&
713
+ NOT_MATH_FUN (name, " expm1" ) && NOT_MATH_FUN (name, " log" ) &&
714
+ NOT_MATH_FUN (name, " log10" ) && NOT_MATH_FUN (name, " log2" ) &&
715
+ NOT_MATH_FUN (name, " log1p" ) &&
716
+ // Other
717
+ NOT_MATH_FUN (name, " erf" ));
696
718
}
697
719
}
698
720
}
0 commit comments