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