cvs commit: src/sbin/badsect badsect.c

Bruce Evans bde at zeta.org.au
Mon Jan 10 04:58:39 PST 2005


On Mon, 10 Jan 2005, Giorgos Keramidas wrote:

> On 2005-01-10 03:36, Bruce Evans <bde at zeta.org.au> wrote:
> >On Wed, 5 Jan 2005, Giorgos Keramidas wrote:

> > >  	for (argc -= 2, argv += 2; argc > 0; argc--, argv++) {
> > > -		number = strtol(*argv, NULL, 0);
> > > -		if (errno == EINVAL || errno == ERANGE)
> > > +		errp = NULL;
> >
> > The variable pointed to by strto*()'s second parameter is an output
> > parameter; initializing it in the caller is bogus.
>
> Are strto*() functions always supposed to set endp to _something_, or is

Not quite.  They are passed a pointer to the end pointer
("char **restrict endptr" in the prototype), and set *endptr if and only
if endptr is non-null.

> there a case for them to attempt saving a few cycles by leaving it
> untouched, possibly set to garbage?  This is what I was trying to avoid.

>From the man page:

%%%
     If endptr is not NULL, strtol() stores the address of the first invalid
     character in *endptr.  If there were no digits at all, however, strtol()
     stores the original value of nptr in *endptr.  (Thus, if *nptr is not
     `\0' but **endptr is `\0' on return, the entire string was valid.)
%%%

The first sentence says that *endptr is always set if endptr is not
NULL.  The wording isn't very good.  It misuses NULL, and the first
sentence is mostly wrong about what is stored and needs to be modified
by the second sentence, and the third sentence gives too much emphasis
to a not very useful condition for the string being valid.

>From a draft C99 standard (n869.txt):

%%%
       [#5] [... if a number is found] A  pointer  to
       the  final  string  is  stored  in  the object pointed to by
       endptr, provided that endptr is not a null pointer.
       ...
       [#7]  [... if a number is not found] the value of nptr
       is  stored in the object pointed to by endptr, provided that
       endptr is not a null pointer.
%%%

This makes the 2 cases clear.  *endptr is either left pointing to the
next part of the string (which may or may not contain another number,
so its validity is context-dependent and the man page shouldn't use
the term "valid"), or *endptr is left pointing to the start of the
string to indicate a lexing error (then the whole string is invalid
although its first character might be valid).

Bruce


More information about the cvs-src mailing list