|
From: <sv...@va...> - 2008-02-25 13:40:45
|
Author: sewardj
Date: 2008-02-25 13:40:42 +0000 (Mon, 25 Feb 2008)
New Revision: 7455
Log:
Fix off-by-one error in complex case (range-splitting required) of
add_var_to_range(), and add a bunch more assertions.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/storage.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/storage.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-25 12:10:07 UTC (rev 7454)
+++ branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-25 13:40:42 UTC (rev 7455)
@@ -567,8 +567,12 @@
DiVariable* var
)
{
- DiAddrRange *first, *last;
- DiAddrRange *range, *rangep;
+ DiAddrRange *first, *last, *range;
+ /* These xx variables are for assertion checking only; they don't
+ contribute anything to the actual work of this function. */
+ DiAddrRange *xxRangep, *xxFirst, *xxLast;
+ UWord xxIters;
+
vg_assert(aMin <= aMax);
if (0) VG_(printf)("add_var_to_arange: %p .. %p\n", aMin, aMax);
@@ -649,36 +653,55 @@
vg_assert(aMax == last->aMax);
+ xxFirst = (DiAddrRange*)VG_(OSetGen_Lookup)(scope, &aMin);
+ xxLast = (DiAddrRange*)VG_(OSetGen_Lookup)(scope, &aMax);
+ vg_assert(xxFirst);
+ vg_assert(xxLast);
+ vg_assert(xxFirst->aMin == aMin);
+ vg_assert(xxLast->aMax == aMax);
+ if (xxFirst != xxLast)
+ vg_assert(xxFirst->aMax < xxLast->aMin);
+
/* Great. Now we merely need to iterate over the segments from
'first' to 'last' inclusive, and add 'var' to the variable set
of each of them. */
- if (0) show_scope( scope, "add_var_to_arange(2)" );
+ if (0) {
+ static UWord ctr = 0;
+ ctr++;
+ VG_(printf)("ctr = %lu\n", ctr);
+ if (ctr >= 33263) show_scope( scope, "add_var_to_arange(2)" );
+ }
- range = rangep = NULL;
+ xxIters = 0;
+ range = xxRangep = NULL;
VG_(OSetGen_ResetIterAt)( scope, &aMin );
while (True) {
- range = VG_(OSetGen_Next)( scope );
+ xxRangep = range;
+ range = VG_(OSetGen_Next)( scope );
if (!range) break;
- if (range->aMin >= aMax) break;
+ if (range->aMin > aMax) break;
+ xxIters++;
if (0) VG_(printf)("have range %p %p\n",
range->aMin, range->aMax);
/* Sanity checks */
- if (!rangep) {
+ if (!xxRangep) {
/* This is the first in the range */
vg_assert(range->aMin == aMin);
} else {
- vg_assert(rangep->aMax + 1 == range->aMin);
+ vg_assert(xxRangep->aMax + 1 == range->aMin);
}
vg_assert(range->vars);
VG_(addToXA)( range->vars, var );
-
- rangep = range;
}
/* Done. We should have seen at least one range. */
- vg_assert(rangep);
- vg_assert(rangep->aMax == aMax);
+ vg_assert(xxIters >= 1);
+ if (xxIters == 1) vg_assert(xxFirst == xxLast);
+ if (xxFirst == xxLast) vg_assert(xxIters == 1);
+ vg_assert(xxRangep);
+ vg_assert(xxRangep->aMax == aMax);
+ vg_assert(xxRangep == xxLast);
}
|