@@ -1157,9 +1157,71 @@ void goto_instrument_parse_optionst::instrument_goto_program()
1157
1157
annotate_invariants (synthesizer.synthesize_all (), goto_model, log );
1158
1158
}
1159
1159
1160
+ bool use_dfcc = false ;
1161
+ if (cmdline.isset (FLAG_DFCC))
1162
+ {
1163
+ use_dfcc = true ;
1164
+
1165
+ if (cmdline.get_values (FLAG_DFCC).size () != 1 )
1166
+ {
1167
+ log .error () << " Only a single --" << FLAG_DFCC << " is allowed"
1168
+ << messaget::eom;
1169
+ throw 0 ;
1170
+ }
1171
+
1172
+ if (cmdline.isset (FLAG_LOOP_CONTRACTS))
1173
+ {
1174
+ log .error () << " The combination of " << FLAG_DFCC << " and "
1175
+ << FLAG_LOOP_CONTRACTS << " is not yet supported"
1176
+ << messaget::eom;
1177
+ throw 0 ;
1178
+ }
1179
+
1180
+ do_indirect_call_and_rtti_removal ();
1181
+
1182
+ const std::string &harness_id = *cmdline.get_values (FLAG_DFCC).begin ();
1183
+
1184
+ std::set<std::string> to_replace (
1185
+ cmdline.get_values (FLAG_REPLACE_CALL).begin (),
1186
+ cmdline.get_values (FLAG_REPLACE_CALL).end ());
1187
+
1188
+ if (
1189
+ !cmdline.get_values (FLAG_ENFORCE_CONTRACT).empty () &&
1190
+ !cmdline.get_values (FLAG_ENFORCE_CONTRACT_REC).empty ())
1191
+ {
1192
+ log .error () << " --" << FLAG_ENFORCE_CONTRACT << " and --"
1193
+ << FLAG_ENFORCE_CONTRACT_REC << " are mutually exclusive"
1194
+ << messaget::eom;
1195
+ throw 0 ;
1196
+ }
1197
+
1198
+ auto &to_enforce = !cmdline.get_values (FLAG_ENFORCE_CONTRACT_REC).empty ()
1199
+ ? cmdline.get_values (FLAG_ENFORCE_CONTRACT_REC)
1200
+ : cmdline.get_values (FLAG_ENFORCE_CONTRACT);
1201
+
1202
+ bool allow_recursive_calls =
1203
+ !cmdline.get_values (FLAG_ENFORCE_CONTRACT_REC).empty ();
1204
+ std::set<std::string> to_check (to_enforce.begin (), to_enforce.end ());
1205
+
1206
+ std::set<std::string> to_exclude_from_nondet_static (
1207
+ cmdline.get_values (" nondet-static-exclude" ).begin (),
1208
+ cmdline.get_values (" nondet-static-exclude" ).end ());
1209
+
1210
+ dfcc (
1211
+ goto_model,
1212
+ harness_id,
1213
+ to_check,
1214
+ allow_recursive_calls,
1215
+ to_replace,
1216
+ false ,
1217
+ to_exclude_from_nondet_static,
1218
+ log );
1219
+ }
1220
+
1160
1221
if (
1161
- cmdline.isset (FLAG_LOOP_CONTRACTS) || cmdline.isset (FLAG_REPLACE_CALL) ||
1162
- cmdline.isset (FLAG_ENFORCE_CONTRACT))
1222
+ !use_dfcc &&
1223
+ (cmdline.isset (FLAG_LOOP_CONTRACTS) || cmdline.isset (FLAG_REPLACE_CALL) ||
1224
+ cmdline.isset (FLAG_ENFORCE_CONTRACT)))
1163
1225
{
1164
1226
do_indirect_call_and_rtti_removal ();
1165
1227
code_contractst contracts (goto_model, log );
@@ -1911,10 +1973,12 @@ void goto_instrument_parse_optionst::help()
1911
1973
" force aggressive slicer to preserve all direct paths\n " // NOLINT(*)
1912
1974
" \n "
1913
1975
" Code contracts:\n "
1976
+ HELP_DFCC
1914
1977
HELP_LOOP_CONTRACTS
1915
1978
HELP_LOOP_INVARIANT_SYNTHESIZER
1916
1979
HELP_REPLACE_CALL
1917
1980
HELP_ENFORCE_CONTRACT
1981
+ HELP_ENFORCE_CONTRACT_REC
1918
1982
" \n "
1919
1983
" User-interface options:\n "
1920
1984
HELP_FLUSH
0 commit comments