]> git.neil.brown.name Git - wiggle.git/commitdiff
Clean up more valgrind errors.
authorNeil Brown <neilb@suse.de>
Wed, 24 Aug 2011 06:28:34 +0000 (16:28 +1000)
committerNeil Brown <neilb@suse.de>
Wed, 24 Aug 2011 06:28:34 +0000 (16:28 +1000)
Various issues found by watching valgrind.  Typically falling
one way or the other off the end of an array.

Signed-off-by: NeilBrown <neilb@suse.de>
bestmatch.c
diff.c
dotest
wiggle.h

index 7e9a44ca65c16467b6b8c7307a58a1e3d2532621..1c899fd52b0466b008e5cbc0d7c4dc49ea1dab3c 100644 (file)
@@ -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 6451fce4683b61288e5325d3aada1a6124907efc..9b863e574d202c124dd345de4d5345e84c4d13c0 100644 (file)
--- 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 d2677f4bc154262f30f8d4f87a7f7b0e18adea6d..f3b6903e33b4dae662a96d16cc98c638446b24c4 100755 (executable)
--- 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
index c0c3dd65c3597ddd0be390873e38992b2dd6a727..1006ed38b3c5f9e8dab9022b79ebbbbd77facc52 100644 (file)
--- a/wiggle.h
+++ b/wiggle.h
@@ -34,8 +34,8 @@ struct stream {
 
 
 struct elmnt {
-       int hash;
        char *start;
+       int hash;
        int len;
 };