Date: Tue, 27 May 2003 20:02:00 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Seva Gluschenko <gvs@rinet.ru> Cc: Dag-Erling Smorgrav <des@freebsd.org> Subject: Re: bin/52691: str[n][case]cmp may cause segmentation violationwith NULL pointers passed Message-ID: <20030527194116.V1802@gamplex.bde.org> In-Reply-To: <20030527121942.W33922@road.demos.su> References: <200305262053.h4QKr3GB026031@freefall.freebsd.org> <20030527121942.W33922@road.demos.su>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 27 May 2003, Seva Gluschenko wrote: > Message of Dag-Erling Smorgrav at May 26 13:53 ... > > DS> Synopsis: str[n][case]cmp may cause segmentation violation with NULL pointers passed > DS> > DS> State-Changed-From-To: open->closed > DS> State-Changed-By: des > DS> State-Changed-When: Mon May 26 13:53:02 PDT 2003 > DS> State-Changed-Why: > DS> The bug is in the application that passes NULL to strcmp. > > Well, sir, can you please quote me some ISO C89 or another standard > which allows str*cmp not to care about NULL pointers? >From n869.txt (a text version of a draft of C99): %%% 7.21 String handling <string.h> 7.21.1 String function conventions [#1] The header <string.h> declares one type and several functions, and defines one macro useful for manipulating arrays of character type and other objects treated as arrays of character type.245) The type is size_t and the macro is NULL (both described in 7.17). Various methods are used for determining the lengths of the arrays, but in all cases a char * or void * argument points to the initial (lowest addressed) character of the array. [...] %%% NULL doesn't point to an object, so the behavior is undefined (even for the mem* functions with a count of 0). Also, the str* functions take args that are are pointers to the first element of a string; a string is a '\0'-terminated array of char; it is an object so the pointer to the first element of it cannot be NULL. I couldn't find where the standard explicitly defines "string". In 7.21.1, it carefully avoids saying "string" since it wants to permit the possibly-non-'\0'-terminated arrays of char that are handled by the mem* functions. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030527194116.V1802>