delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1997/03/25/01:40:43

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 <stdlib.h>
#include <string.h>
#include <stdio.h>

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".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019