@@ -267,6 +267,19 @@ bool path_searcht::drop_state(const statet &state)
267
267
{
268
268
goto_programt::const_targett pc=state.get_instruction ();
269
269
270
+ const source_locationt &source_location=pc->source_location ;
271
+
272
+ if (!source_location.is_nil () &&
273
+ last_source_location!=source_location)
274
+ {
275
+ debug () << " SYMEX at file " << source_location.get_file ()
276
+ << " line " << source_location.get_line ()
277
+ << " function " << source_location.get_function ()
278
+ << eom;
279
+
280
+ last_source_location=source_location;
281
+ }
282
+
270
283
// depth limit
271
284
if (depth_limit_set && state.get_depth ()>depth_limit)
272
285
return true ;
@@ -282,17 +295,55 @@ bool path_searcht::drop_state(const statet &state)
282
295
// unwinding limit -- loops
283
296
if (unwind_limit_set && state.get_instruction ()->is_backwards_goto ())
284
297
{
298
+ bool stop=false ;
299
+
285
300
for (const auto &loop_info : state.unwinding_map )
286
301
if (loop_info.second >unwind_limit)
287
- return true ;
302
+ {
303
+ stop=true ;
304
+ break ;
305
+ }
306
+
307
+ const irep_idt id=goto_programt::loop_id (pc);
308
+ path_symex_statet::unwinding_mapt::const_iterator entry=
309
+ state.unwinding_map .find (state.pc ());
310
+ debug () << (stop?" Not unwinding" :" Unwinding" )
311
+ << " loop " << id << " iteration "
312
+ << (entry==state.unwinding_map .end ()?-1 :entry->second )
313
+ << " (" << unwind_limit << " max)"
314
+ << " " << source_location
315
+ << " thread " << state.get_current_thread () << eom;
316
+
317
+ if (stop)
318
+ return true ;
288
319
}
289
320
290
321
// unwinding limit -- recursion
291
322
if (unwind_limit_set && state.get_instruction ()->is_function_call ())
292
323
{
324
+ bool stop=false ;
325
+
293
326
for (const auto &rec_info : state.recursion_map )
294
327
if (rec_info.second >unwind_limit)
295
- return true ;
328
+ {
329
+ stop=true ;
330
+ break ;
331
+ }
332
+
333
+ exprt function=to_code_function_call (pc->code ).function ();
334
+ const irep_idt id=function.get (ID_identifier); // could be nil
335
+ path_symex_statet::recursion_mapt::const_iterator entry=
336
+ state.recursion_map .find (id);
337
+ if (entry!=state.recursion_map .end ())
338
+ debug () << (stop?" Not unwinding" :" Unwinding" )
339
+ << " recursion " << id << " iteration "
340
+ << entry->second
341
+ << " (" << unwind_limit << " max)"
342
+ << " " << source_location
343
+ << " thread " << state.get_current_thread () << eom;
344
+
345
+ if (stop)
346
+ return true ;
296
347
}
297
348
298
349
if (pc->is_assume () &&
0 commit comments