Changeset: 9d29280ca32e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d29280ca32e
Modified Files:
        gdk/gdk.h
Branch: default
Log Message:

Be careful with BUN-NONE values in hash loops
The test web hints at problem when BUN4 is used.
Note, for each BUN* case we use a different BUN_NONE value
to mark the end of the linked list. However, in a HASHloop

#define HASHlooploc(bi, h, hb, v)               \
    for (hb = HASHget(h, HASHprobe(h, v));          \
         hb != HASHnil(h);                  \
         hb = HASHgetlink(h,hb))                \
        if (ATOMcmp(h->type, v, BUNhloc(bi, hb)) == 0)

we break out when the BUN specific BUN_NONE is found.
There is no guarantee that hb is not tested for the general BUN_NONE
value afterwards, which now could be the BUN4 version.

Perhaps the following will do the trick

#define HASHlooploc(bi, h, hb, v)               \
    for (hb = HASHget(h, HASHprobe(h, v));          \
         TRUE;                  \
         hb = HASHgetlink(h,hb))                \
    if ( hb == HASHnil(h)) { hb = BUN_NONE;break;} else \
        if (ATOMcmp(h->type, v, BUNhloc(bi, hb)) == 0)

It seems to address a single error instance. The code does not
contain direct access to hash[ and link[.
Up for a second testweb round.


diffs (40 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2970,19 +2970,22 @@ gdk_export int ALIGNsetH(BAT *b1, BAT *b
  */
 #define HASHlooploc(bi, h, hb, v)                              \
        for (hb = HASHget(h, HASHprobe(h, v));                  \
-            hb != HASHnil(h);                                  \
+            TRUE;                                      \
             hb = HASHgetlink(h,hb))                            \
+               if ( hb == HASHnil(h) ){ hb = BUN_NONE; break;} else \
                if (ATOMcmp(h->type, v, BUNhloc(bi, hb)) == 0)
 #define HASHloopvar(bi, h, hb, v)                              \
        for (hb = HASHget(h,HASHprobe(h, v));                   \
-            hb != HASHnil(h);                                  \
+            TRUE;                                      \
             hb = HASHgetlink(h,hb))                            \
+               if ( hb == HASHnil(h) ){ hb = BUN_NONE; break;} else \
                if (ATOMcmp(h->type, v, BUNhvar(bi, hb)) == 0)
 
 #define HASHloop_TYPE(bi, h, hb, v, TYPE)                      \
        for (hb = HASHget(h, hash_##TYPE(h, v));                        \
-            hb != HASHnil(h);                                  \
+            TRUE;                                      \
             hb = HASHgetlink(h,hb))                            \
+               if ( hb == HASHnil(h) ){ hb = BUN_NONE; break;} else \
                if (simple_EQ(v, BUNhloc(bi, hb), TYPE))
 
 #define HASHloop_bit(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, bte)
@@ -2999,8 +3002,9 @@ gdk_export int ALIGNsetH(BAT *b1, BAT *b
 
 #define HASHloop_any(bi, h, hb, v)                             \
        for (hb = HASHget(h, hash_any(h, v));                   \
-            hb != HASHnil(h);                                  \
+            TRUE;                                      \
             hb = HASHgetlink(h,hb))                            \
+               if ( hb == HASHnil(h) ){ hb = BUN_NONE; break;} else \
                if (atom_EQ(v, BUNhead(bi, hb), (bi).b->htype))
 
 /*
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to