[PATCH 1/2] covoar/CoverageReaderQEMU: Fix infinite loop
Chris Johns
chrisj at rtems.org
Mon Mar 15 00:26:53 UTC 2021
On 12/3/21 5:30 am, Alex White wrote:
> 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 | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/tester/covoar/CoverageReaderQEMU.cc b/tester/covoar/CoverageReaderQEMU.cc
> index 7c344e4..fb1709d 100644
> --- a/tester/covoar/CoverageReaderQEMU.cc
> +++ b/tester/covoar/CoverageReaderQEMU.cc
> @@ -76,7 +76,7 @@ namespace Coverage {
> //
> // Read ENTRIES number of trace entries.
> //
> -#define ENTRIES 1024
> +#define ENTRIES 20000
1024 sure, 20,000 ... hmmm ... I am not so sure. If you need more would is the
change 200,000? Maybe a better solution exists.
> while (true) {
> CoverageMapBase *aCoverageMap = NULL;
> struct trace_entry entries[ENTRIES];
Can an array or resized vector be used here?
> @@ -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;
An aside ... more pointers being used.
Chris
> - 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) {
>
More information about the devel
mailing list