[PATCH v2 1/2] covoar/CoverageReaderQEMU: Fix infinite loop

Alex White alex.white at oarcorp.com
Wed Mar 24 13:45:07 UTC 2021


There was a potential that the branch info loop never terminated.
This has been fixed by adding a more reliable termination condition
and logging an error if it cannot find the branch target.
---
 tester/covoar/CoverageReaderQEMU.cc | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tester/covoar/CoverageReaderQEMU.cc b/tester/covoar/CoverageReaderQEMU.cc
index 7c344e4..d3c6abe 100644
--- a/tester/covoar/CoverageReaderQEMU.cc
+++ b/tester/covoar/CoverageReaderQEMU.cc
@@ -118,8 +118,15 @@ namespace Coverage {
         // Determine if additional branch information is available.
         if ( (entry->op & branchInfo) != 0 ) {
           uint32_t  a = entry->pc + entry->size - 1;
-            while (!aCoverageMap->isStartOfInstruction(a))
+            while (a > entry->pc && !aCoverageMap->isStartOfInstruction(a))
               a--;
+            if (a == entry->pc && !aCoverageMap->isStartOfInstruction(a)) {
+              // Something went wrong parsing the objdump.
+              std::ostringstream what;
+              what << "Reached beginning of range in " << file
+                << " at " << entry->pc << " with no start of instruction.";
+              throw rld::error( what, "CoverageReaderQEMU::processFile" );
+            }
             if (entry->op & taken) {
               aCoverageMap->setWasTaken( a );
             } else if (entry->op & notTaken) {
-- 
2.27.0



More information about the devel mailing list