From: khan AT xraylith DOT wisc DOT edu (Mumit Khan) Subject: nasty bug in bsearch() in b17.1 under Windows'95???? 25 Mar 1997 01:40:43 -0800 Approved: cygnus DOT gnu-win32 AT cygnus DOT com Distribution: cygnus Message-ID: <9703250627.AA12477.cygnus.gnu-win32@modi.xraylith.wisc.edu> Original-To: gnu-win32 AT cygnus DOT com Original-Cc: noer AT cygnus DOT com Original-Sender: owner-gnu-win32 AT cygnus DOT com I believe there is a nasty bug in bsearch that gets tickled whenever the item to be searched for is "greater" than the last item in the list supplied. Take the following trivial code: === bsearch-bug.c #include #include #include char *mynames[] = {"bb", "cc", "za"}; #define ARRAY_SIZE(x) sizeof(x)/sizeof((x)[0]) static int compare_name(const void *name, const void *item_name) { const char *x_name = (char*) name; const char *y_name = *((char**) item_name); /* in gdb, do a display on both x_name and y_name */ return strcmp(x_name, y_name); } int main(int argc, char* argv[]) { char *what = (argc == 2) ? argv[1] : "zb"; char *item = bsearch(what, &mynames[0], ARRAY_SIZE (mynames), sizeof (mynames[0]), (void*) compare_name); printf ("Item %s %s\n", what, (item) ? "FOUND" : "NOT FOUND"); return 0; } === bsearch-bug.c % gcc -g -o bsearch-bug.exe bsearch.c % ./bsearch aa Item aa NOT FOUND % ./bsearch bb Item bb FOUND % ./bsearch za Item za FOUND % ./bsearch zb Item zb NOT FOUND <<- this is expected, but it's buggy! The last case is where the bug is. The comparison function is passed a pointer that is *one past* the last item. To see it, simply use the display feature in gdb and watch for the addresses being passed to compare_name when trying to find "zb". Could someone please verify this on their system? Mine is rather hacked up and I would like a second opinion before calling it a bug. Unfortunately I'm on the road with no ready access to the source tree, but hopefully will post a fix when I get back in a day or two (unless of course the bug is due to my own changes :-). fyi, this breaks g77 quite horribly when compiling anything with a subroutine or function name of "zsw" or greater. Cheers Mumit -- khan AT xraylith DOT wisc DOT edu http://www.xraylith.wisc.edu/~khan/ - For help on using this list, send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".