public String smgAsDot(CLangSMG smg, String name, String location) { StringBuilder sb = new StringBuilder(); sb.append("digraph gr_" + name.replace('-', '_') + "{\n"); offset += 2; sb.append(newLineWithOffset("label = \"Location: " + location.replace("\"", "") + "\";")); addStackSubgraph(smg, sb); for (SMGObject heapObject : smg.getHeapObjects()) { sb.append(newLineWithOffset(smgObjectAsDot(heapObject, smg))); locationIndex.put(Location.valueOf(heapObject), heapObject.getLabel()); } // This only works after creating all heap Objects, // because we can't differentiate between global Memlocs and heap Memlocs addGlobalObjectSubgraph(smg, sb); Map<Integer, MemoryLocation> coveredBySMG = new HashMap<>(); Set<MemoryLocation> coveredMemloc = new HashSet<>(); for (SMGEdgeHasValue edge : smg.getHVEdges()) { SMGObject obj = edge.getObject(); String functionName = smg.getFunctionName(obj); MemoryLocation memloc = smgState.resolveMemLoc(SMGAddress.valueOf(obj, edge.getOffset()), functionName); if (explicitState.contains(memloc)) { coveredBySMG.put(edge.getValue(), memloc); coveredMemloc.add(memloc); } } for (int value : smg.getValues()) { sb.append(newLineWithOffset(smgValueAsDot(value, coveredBySMG))); } Set<MemoryLocation> notCoveredBySMG = new HashSet<>(); for (MemoryLocation memloc : explicitState.getTrackedMemoryLocations()) { // We don't consider values from the old Nomenclature in explicit cpa if (!coveredMemloc.contains(memloc) && !memloc.getAsSimpleString().contains("->")) { sb.append(newLineWithOffset(explicitValueAsDot(memloc))); notCoveredBySMG.add(memloc); } } for (SMGEdgeHasValue edge : smg.getHVEdges()) { sb.append(newLineWithOffset(smgHVEdgeAsDot(edge, smg))); } for (MemoryLocation memloc : notCoveredBySMG) { sb.append(newLineWithOffset(memlocAsDot(memloc))); } for (SMGEdgePointsTo edge : smg.getPTEdges().values()) { sb.append(newLineWithOffset(smgPTEdgeAsDot(edge, smg))); } sb.append("}"); return sb.toString(); }
private Location(MemoryLocation pMemloc) { location = pMemloc.getAsSimpleString(); }