summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex White <alex.white@oarcorp.com>2021-02-24 15:58:08 -0600
committerJoel Sherrill <joel@rtems.org>2021-03-30 13:15:58 -0500
commit2845f6c0dad734d27d57bd4f565fb4126f806be7 (patch)
treed101afa149151d54112511328bd5db1c553a7226
parentcovoar/Target_arm: Add THUMB branch instructions (diff)
downloadrtems-tools-2845f6c0dad734d27d57bd4f565fb4126f806be7.tar.bz2
covoar/CoverageReaderQEMU: Fix infinite loop
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.
-rw-r--r--tester/covoar/CoverageReaderQEMU.cc9
1 files changed, 8 insertions, 1 deletions
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) {