From 477c37643c55ed1bc0e4bed222f0cab98c785b80 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 27 Apr 2020 11:22:05 +0200 Subject: [PATCH] Bug, In Session::_revalidateTopology(), iterate over an invalid vector! * Bug: In Anabatic::Session::_revalidateTopology(), when iterating over _segmentInvalidateds, the vector can be modified. If it leads to a reallocation we end up on invalid iterators (using freed memory so sometimes with overwritten contents). Now, iterate with an index which warranty that we get a valid item at each iteration of the loop. And, of course, the vector is ensured to not shrink... * Change: In Anabatic::Session::Session(), reserve (pre-allocate) at least 1024 elements for all vectors. Mostly prevent the above bug and avoid constant reallocation. --- anabatic/src/AnabaticEngine.cpp | 4 ++-- anabatic/src/Session.cpp | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index 99198d15..4bd173a7 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -1515,7 +1515,7 @@ namespace Anabatic { Edge* edge = neighbor->getWestEdge(); if (not edge) break; - if (edge->getReservedCapacity() < maxTermSat) + if (edge->getReservedCapacity() < (uint32_t)maxTermSat) edge->reserveCapacity( maxTermSat - edge->getReservedCapacity() ); neighbor = neighbor->getWest(); } @@ -1524,7 +1524,7 @@ namespace Anabatic { Edge* edge = neighbor->getEastEdge(); if (not edge) break; - if (edge->getReservedCapacity() < maxTermSat) + if (edge->getReservedCapacity() < (uint32_t)maxTermSat) edge->reserveCapacity( maxTermSat - edge->getReservedCapacity() ); neighbor = neighbor->getEast(); } diff --git a/anabatic/src/Session.cpp b/anabatic/src/Session.cpp index 074f51ad..ea8e0a9b 100644 --- a/anabatic/src/Session.cpp +++ b/anabatic/src/Session.cpp @@ -82,7 +82,12 @@ namespace Anabatic { , _segmentRevalidateds() , _netInvalidateds () , _netRevalidateds () - { } + { + _autoContacts .reserve( 1024 ); + _doglegs .reserve( 1024 ); + _segmentInvalidateds.reserve( 1024 ); + _segmentRevalidateds.reserve( 1024 ); + } void Session::_postCreate () @@ -219,7 +224,9 @@ namespace Anabatic { } _canonize (); - for ( AutoSegment* segment : _segmentInvalidateds ) { + AutoSegment* segment = NULL; + for ( size_t i=0 ; i<_segmentInvalidateds.size() ; ++i ) { + segment = _segmentInvalidateds[i]; if (segment->isCanonical()) { if (segment->isUnsetAxis()) segment->toOptimalAxis(); else segment->toConstraintAxis();