private void continueTraversal(int pValue, SMGSingleLinkedListCandidate pCandidate) { SMGEdgePointsTo pt = smg.getPointer(pValue); SMGObject object = pt.getObject(); if (!candidates.containsKey(object)) { startTraversal(object); } if (inboundPointers.get(pValue) > 1) { return; } Map<Integer, SMGSingleLinkedListCandidate> objectCandidates = candidates.get(object); Integer offset = pCandidate.getOffset(); if (!objectCandidates.containsKey(offset)) { // try to infer a pointer presence: either NULL, or uninitialized if (smg.isCoveredByNullifiedBlocks(object, offset, AnonymousTypes.dummyPointer)) { objectCandidates.put(offset, new SMGSingleLinkedListCandidate(object, offset, 1)); } } if (objectCandidates.containsKey(offset)) { SMGSingleLinkedListCandidate myCandidate = objectCandidates.get(offset); if (pCandidate.isCompatibleWith(myCandidate)) { objectCandidates.remove(offset); pCandidate.addLength(myCandidate.getLength()); } } }
@Test public void simpleListTest() { CLangSMG smg = new CLangSMG(MachineModel.LINUX64); SMGEdgeHasValue root = TestHelpers.createGlobalList(smg, 5, 16, 8, "pointer"); SMGSingleLinkedListFinder finder = new SMGSingleLinkedListFinder(1); Set<SMGAbstractionCandidate> candidates = finder.traverse(smg); Assert.assertEquals(1, candidates.size()); SMGAbstractionCandidate candidate = Iterables.getOnlyElement(candidates); Assert.assertTrue(candidate instanceof SMGSingleLinkedListCandidate); SMGSingleLinkedListCandidate sllCandidate = (SMGSingleLinkedListCandidate) candidate; Assert.assertEquals(5, sllCandidate.getLength()); Assert.assertEquals(8, sllCandidate.getOffset()); SMGRegion expectedStart = (SMGRegion) smg.getPointer(root.getValue()).getObject(); Assert.assertSame(expectedStart, sllCandidate.getStart()); }