1919import com .dat3m .dartagnan .program .event .Tag ;
2020import com .dat3m .dartagnan .program .event .core .Assert ;
2121import com .dat3m .dartagnan .program .event .core .CondJump ;
22+ import com .dat3m .dartagnan .program .memory .MemoryObject ;
2223import com .dat3m .dartagnan .program .processing .LoopUnrolling ;
2324import com .dat3m .dartagnan .program .Entrypoint ;
2425import com .dat3m .dartagnan .utils .ExitCode ;
@@ -316,7 +317,7 @@ private static void generateWitnessIfAble(VerificationTask task, ProverEnvironme
316317 // ------------------ Generate Witness, if possible ------------------
317318 final EnumSet <Property > properties = task .getProperty ();
318319 if (task .getProgram ().getFormat ().equals (SourceLanguage .LLVM ) && modelChecker .hasModel ()
319- && (properties .contains (PROGRAM_SPEC ) || properties .contains (DATARACEFREEDOM )) && properties . size () == 1
320+ && (properties .contains (PROGRAM_SPEC ) || properties .contains (DATARACEFREEDOM ))
320321 && modelChecker .getResult () != UNKNOWN ) {
321322 try {
322323 WitnessBuilder w = WitnessBuilder .of (modelChecker .getEncodingContext (), prover ,
@@ -362,14 +363,7 @@ private static ResultSummary summaryFromResult(VerificationTask task, ModelCheck
362363 .stream ().filter (model ::assertionViolated )
363364 .toList ();
364365 for (Assert ass : violations ) {
365- final String callStack = makeContextString (synContext .getContextInfo (ass ).getContextOfType (CallContext .class ), " -> " );
366- details
367- .append ("\t E" ).append (ass .getGlobalId ())
368- .append (":\t " )
369- .append (callStack .isEmpty () ? callStack : callStack + " -> " )
370- .append (getSourceLocationString (ass ))
371- .append (": " ).append (ass .getErrorMessage ())
372- .append ("\n " );
366+ appendTo (details , ass , synContext );
373367 }
374368 // In validation mode, we expect to find the violation, thus NORMAL_TERMINATION
375369 ExitCode code = task .getWitness ().isEmpty () ? PROGRAM_SPEC_VIOLATION : NORMAL_TERMINATION ;
@@ -385,14 +379,7 @@ private static ResultSummary summaryFromResult(VerificationTask task, ModelCheck
385379 && model .isBlocked (barrier );
386380
387381 if (isStuckLoop || isStuckBarrier ) {
388- final String callStack = makeContextString (
389- synContext .getContextInfo (e ).getContextOfType (CallContext .class ), " -> " );
390- details
391- .append ("\t E" ).append (e .getGlobalId ())
392- .append (":\t " )
393- .append (callStack .isEmpty () ? callStack : callStack + " -> " )
394- .append (getSourceLocationString (e ))
395- .append ("\n " );
382+ appendTo (details , e , synContext );
396383 }
397384 }
398385 // In validation mode, we expect to find the violation, thus NORMAL_TERMINATION
@@ -405,6 +392,16 @@ private static ResultSummary summaryFromResult(VerificationTask task, ModelCheck
405392 ExitCode code = task .getWitness ().isEmpty () ? DATA_RACE_FREEDOM_VIOLATION : NORMAL_TERMINATION ;
406393 return new ResultSummary (path , filter , FAIL , condition , reason , details .toString (), time , code );
407394 }
395+ if (props .contains (TRACKABILITY ) && model .propertyViolated (TRACKABILITY )) {
396+ reason = ResultSummary .SVCOMP_UNTRACKABLE_OBJECT_REASON ;
397+ for (MemoryObject o : p .getMemory ().getObjects ()) {
398+ if (model .isLeaked (o ) && !model .isTrackable (o )) {
399+ appendTo (details , o .getAllocationSite (), synContext );
400+ }
401+ }
402+ ExitCode code = task .getWitness ().isEmpty () ? MEMORY_TRACKABILITY_VIOLATION : NORMAL_TERMINATION ;
403+ return new ResultSummary (path , filter , FAIL , condition , reason , details .toString (), time , code );
404+ }
408405 final List <Axiom > violatedCATSpecs = !props .contains (CAT_SPEC ) ? List .of ()
409406 : task .getMemoryModel ().getAxioms ().stream ()
410407 .filter (Axiom ::isFlagged )
@@ -447,6 +444,17 @@ private static ResultSummary summaryFromResult(VerificationTask task, ModelCheck
447444 return new ResultSummary (path , filter , result , condition , reason , details .toString (), time , code );
448445 }
449446
447+ private static void appendTo (StringBuilder details , Event event , SyntacticContextAnalysis synContext ) {
448+ final String callStack = makeContextString (synContext .getContextInfo (event ).getContextOfType (CallContext .class ), " -> " );
449+ details .append ("\t E" ).append (event .getGlobalId ())
450+ .append (":\t " ).append (callStack .isEmpty () ? callStack : callStack + " -> " )
451+ .append (getSourceLocationString (event ));
452+ if (event instanceof Assert ass ) {
453+ details .append (": " ).append (ass .getErrorMessage ());
454+ }
455+ details .append ("\n " );
456+ }
457+
450458 private static void increaseBoundAndDump (List <Event > boundEvents , Configuration config ) throws IOException {
451459 if (!config .hasProperty (BOUNDS_SAVE_PATH )) {
452460 return ;
0 commit comments