|
| From: | Jan Djärv |
| Subject: | Re: fix the sscanf usage in etags |
| Date: | Wed, 09 Aug 2006 08:57:15 +0200 |
| User-agent: | Thunderbird 1.5.0.4 (X11/20060614) |
Kevin Ryde skrev:
Masatake YAMATO <address@hidden> writes:- if (sscanf (lbp->buffer, "#line %d \"%n", &lno, &start) == 1) + if (sscanf (lbp->buffer, "#line %d \"%n", &lno, &start) == 2)I think that's wrong, I believe %n is not included in the return count. Eg. in the current glibc, and in the posix spec (under "n"), http://www.opengroup.org/onlinepubs/007904975/functions/scanf.html
The man page on GNU/Linux says:
The C standard says: "Execution of a %n directive
does not increment the assignment count returned at the comple-
tion of execution" but the Corrigendum seems to contradict this.
Probably it is wise not to make any assumptions on the effect of
%n conversions on the return value.
So I guess we safely can test for >= 1 instead for those implementations that
do return 2. I've checked in that change.
It does look like there's a problem with degenerate input having
"start" used uninitialized though. Eg. say
#line 00000000000000000000000000000
We can switch places between \" and %n and check for ":
if (sscanf (lbp->buffer, "#line %d %n\"", &lno, &start) >= 1
&& lbp->buffer[start] == '"')
{
char *endp = lbp->buffer + ++start;
Jan D.
| [Prev in Thread] | Current Thread | [Next in Thread] |