From: Neil Brown Date: Wed, 24 Aug 2011 06:28:34 +0000 (+1000) Subject: Clean up more valgrind errors. X-Git-Tag: v0.9~62 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=a87501ff6e2e4ab27eafd3220248638ad646b1e8;p=wiggle.git Clean up more valgrind errors. Various issues found by watching valgrind. Typically falling one way or the other off the end of an array. Signed-off-by: NeilBrown --- diff --git a/bestmatch.c b/bestmatch.c index 7e9a44c..1c899fd 100644 --- a/bestmatch.c +++ b/bestmatch.c @@ -234,7 +234,8 @@ static void find_best(struct file *a, struct file *b, update_value(&v[khi], -1, khi, x); while (khi-2 > (ahi-bhi) && (x > ahi || - (best_val(&v[khi], min(ahi-x, bhi-y)) < best[v[khi].c].val && + (v[khi].c >= 0 && + best_val(&v[khi], min(ahi-x, bhi-y)) < best[v[khi].c].val && best_val(&v[khi-1], min(ahi-x+1, bhi-y)) < best[v[khi].c].val ) )) { @@ -375,12 +376,12 @@ static void remap(struct best *best, int cnt, best[b].ylo = pb; while (pa < a2.elcnt && - a2.list[pa-1].start != a1.list[best[b].xhi-1].start) + (pa == 0 || a2.list[pa-1].start != a1.list[best[b].xhi-1].start)) pa++; if (pa == a2.elcnt && best[b].xhi != a1.elcnt) abort(); while (pb < b2.elcnt && - b2.list[pb-1].start != b1.list[best[b].yhi-1].start) + (pb == 0 || b2.list[pb-1].start != b1.list[best[b].yhi-1].start)) pb++; if (pb == b2.elcnt && best[b].yhi != b1.elcnt) abort(); diff --git a/diff.c b/diff.c index 6451fce..9b863e5 100644 --- a/diff.c +++ b/diff.c @@ -136,7 +136,9 @@ static int find_common(struct file *a, struct file *b, } for (k = klo+1; k <= khi-1 ; k += 2) { - if (v[k-1].x+1 >= v[k+1].x) { + if (v[k-1].x+1 > ahi) { + v[k] = v[k+1]; + } else if (v[k+1].x - k > bhi || v[k-1].x+1 >= v[k+1].x) { v[k] = v[k-1]; v[k].x++; } else { @@ -146,29 +148,19 @@ static int find_common(struct file *a, struct file *b, x = v[klo].x; y = x - (klo-1); dist = abs((ahi-x)-(bhi-y)); - if (dist <= best) { + if (y <= bhi && dist <= best) { v[klo-1] = v[klo]; klo--; } else - while (dist > best) { - klo++; - x = v[klo].x; - y = x - (klo-1); - dist = abs((ahi-x)-(bhi-y)); - } - + klo++; x = v[khi].x+1; y = x - (khi+1); dist = abs((ahi-x)-(bhi-y)); - if (dist <= best) { + if (x <= ahi && dist <= best) { v[khi+1] = v[khi]; v[khi+1].x++; khi++; } else - while (dist > best) { - khi--; - x = v[khi].x+1; y = x - (khi+1); - dist = abs((ahi-x)-(bhi-y)); - } + khi--; } } diff --git a/dotest b/dotest index d2677f4..f3b6903 100755 --- a/dotest +++ b/dotest @@ -21,7 +21,7 @@ if $TIME true > /dev/null 2>&1 then : else TIME= fi - +#TIME=valgrind status=0 ok=0 fail=0 diff --git a/wiggle.h b/wiggle.h index c0c3dd6..1006ed3 100644 --- a/wiggle.h +++ b/wiggle.h @@ -34,8 +34,8 @@ struct stream { struct elmnt { - int hash; char *start; + int hash; int len; };