sprintf(3s) query
Charlie Geyer
charlie at mica.stat.washington.edu
Thu Dec 8 13:35:06 AEST 1988
It seems that in 4.3 BSD (and before?) sprintf doesn't lint right
except on a VAX. Consider the following little program.
#include <stdio.h>
main()
{
char s[20];
sprintf(s,"foo");
fprintf(stdout," %s\n",s);
sprintf(s,"foo");
fprintf(stdout," %s\n",s);
}
which compiles and works fine. It also lints fine on a VAX running
4.3 BSD from mt Xinu. On a Sun-3 running Sun UNIX 4.2 Release 3.2
lint gives the following rather odd error message
sprintf value declared inconsistently llib-lc(512) :: goo.c(9)
What's going on? And why just the error in line 9. Why not in line 7
as well? Looking /usr/lib/lint/llib-lc we see that lint thinks that
sprintf returns a char * which agrees with what the man page says.
But /usr/include/stdio.h has the following interesting item
#ifdef vax
char *sprintf(); /* too painful to do right */
#endif
so it doesn't define what sprintf returns (and by default C assumes
that sprintf returns an int).
So two questions:
(1) What is "too painful to do right" and why?
(2) Why doesn't lint give an error for line 7 as well? I'm not
asking for an explanation of why lint does this. I want a
justification of why it *should* do this.
This error is not Sun-specific. On an IBM RT running IBM Academic
Information Systems 4.3 (which somebody told me is approximately 4.3
BSD and looks like it). /usr/include/stdio.h has the same ifdef and
comment about "too painful to do right" and so does not define what
sprintf returns. But here the man page doesn't specify the type
sprintf returns either (so int is default). But /usr/lib/lint/llib-lc
says that sprintf returns a char *. So the RT gives the same error
message
sprintf value declared inconsistently llib-lc(438) :: goo.c(9)
The RT has source and /usr/src/lib/libc/stdio/sprintf.c says that
sprintf does indeed return a char *, it's first argument. So (if the
source is to be believed) the man page and stdio.h are broken.
More information about the Comp.lang.c
mailing list