lots of questions (va_list, embedded perl, cvsd, introduction - sort of)
Franz Sirl
Franz.Sirl-kernel at lauterbach.com
Wed Dec 6 03:25:07 EST 2000
On Tuesday 05 December 2000 08:39, Alex Avriette wrote:
> void
> log (const char *fmt, ...)
> {
> va_list ap;
>
> char buf[1024];
>
> va_start (ap, fmt); vsnprintf ( buf, 1022, fmt, ap ); va_end (ap);
> va_start (ap, fmt); vprintf ( fmt, ap ); va_end (ap);
>
> fputc ('\n', stdout);
> fflush (stdout);
>
> putchan ( "#log", "logd", buf );
> }
This code looks OK. What environment? (gcc/glibc)
> #include <stdarg.h>
> #include <stdio.h>
>
> void vsn_test ( const char *fmt, ...)
> {
> va_list ap; char buf [1024]; int i;
>
> va_start ( ap, fmt ); vsnprintf ( buf, 1022, fmt, ap ); va_end ( ap );
>
> for (i = 1; i < 5; i++)
> { printf ( "pass [%d] %s\n", i, buf );
> va_start ( ap, fmt ); vsnprintf ( buf, 1022, fmt, ap ); va_end ( ap );
> } }
This works as expected here.
> void v_test ( const char *fmt, ...)
> {
> va_list ap; int i;
>
> for (i = 1; i != 5; i++)
> { printf ( "pass [%d] ", i );
> va_start ( ap, fmt ); vprintf ( fmt, ap ); va_end ( ap ); printf
> ("\n"); } }
This works as expected here.
> void vs_test ( const char *fmt, ...)
> {
> va_list ap; char buf[1024]; int i;
>
> for (i = 1; i != 5; i++)
> { printf ("pass [%d] %s\n", i );
> va_start ( ap, fmt ); vsprintf ( buf, fmt, ap ); va_end ( ap ); }
> }
This testcase is buggy (look at the printf!), if fixed it behaves as
expected. You would have seen that if you compiled with -W -Wall!
> void dual_va_test ( const char *fmt, ...)
> {
> va_list ap; char buf [1024]; int i;
>
> for (i = 1; i < 5; i++)
> { va_start ( ap, fmt ); vsnprintf ( buf, 1022, fmt, ap); va_end ( ap ) ;
> printf ( "dual-run pass [%d][vsn] %s\n", i, buf );
> printf ( "dual-run pass [%d][v] ", i);
> va_start ( ap, fmt ); vprintf ( fmt, ap ); va_end ( ap ); printf
> ("\n"); } }
This works as expected here.
> void nested_test ( const char *fmt, ...)
> {
> va_list ap; char bufa [1024]; char bufb [1024]; int i;
>
> for (i = 1; i < 5; i++)
> { va_start ( ap, fmt );
> vsnprintf ( bufa, 1022, fmt, ap );
> vsnprintf ( bufb, 1022, fmt, ap );
> va_end ( ap );
>
> printf ("buffer [a] pass [%d]: %s\n", i, bufa);
> printf ("buffer [b] pass [%d]: %s\n", i, bufb); }
> }
This testcase is bogus since you miss the required va_start/va_end pairs. It
misbehaves as expected.
I've tested this both with gcc-2.95.3 and a recent gcc-2.97 snapshot. This
looks a lot like your are still using egcs on PPC, don't do that, use
gcc-2.95.[23] as the current distributions do.
Franz.
gcc-2.95.3 log:
[fsirl at enzo:/cvsx/bugs]$ ~/gnubin2/bin/gcc -v
Reading specs from
/home/fsirl/gnubin2/lib/gcc-lib/ppc-redhat-linux/2.95.3/specs
gcc version 2.95.3 19991130 (prerelease)
[fsirl at enzo:/cvsx/bugs]$ ~/gnubin2/bin/gcc -O2 -W -Wall va-arg-test.c
[fsirl at enzo:/cvsx/bugs]$ ./a.out
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
dual-run pass [1][vsn] int: 25 string: somestring
dual-run pass [1][v] int: 25 string: somestring
dual-run pass [2][vsn] int: 25 string: somestring
dual-run pass [2][v] int: 25 string: somestring
dual-run pass [3][vsn] int: 25 string: somestring
dual-run pass [3][v] int: 25 string: somestring
dual-run pass [4][vsn] int: 25 string: somestring
dual-run pass [4][v] int: 25 string: somestring
buffer [a] pass [1]: int: 25 string: somestring
buffer [b] pass [1]: int: 2147480576 string:
buffer [a] pass [2]: int: 25 string: somestring
buffer [b] pass [2]: int: 2147480576 string:
buffer [a] pass [3]: int: 25 string: somestring
buffer [b] pass [3]: int: 2147480576 string:
buffer [a] pass [4]: int: 25 string: somestring
buffer [b] pass [4]: int: 2147480576 string:
[fsirl at enzo:/cvsx/bugs]$
gcc-2.97 log:
[fsirl at enzo:/cvsx/bugs]$ gcc -v
Reading specs from /usr/lib/gcc-lib/ppc-redhat-linux/2.97/specs
Configured with: --prefix=/usr --mandir=/usr/man --infodir=/usr/info
--enable-shared --enable-threads=posix --host=ppc-redhat-linux
gcc version 2.97 20001106 (experimental)
[fsirl at enzo:/cvsx/bugs]$ gcc -O2 -W -Wall va-arg-test.c
[fsirl at enzo:/cvsx/bugs]$ ./a.out
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
pass [1] int: 25 string: somestring
pass [2] int: 25 string: somestring
pass [3] int: 25 string: somestring
pass [4] int: 25 string: somestring
dual-run pass [1][vsn] int: 25 string: somestring
dual-run pass [1][v] int: 25 string: somestring
dual-run pass [2][vsn] int: 25 string: somestring
dual-run pass [2][v] int: 25 string: somestring
dual-run pass [3][vsn] int: 25 string: somestring
dual-run pass [3][v] int: 25 string: somestring
dual-run pass [4][vsn] int: 25 string: somestring
dual-run pass [4][v] int: 25 string: somestring
Segmentation fault
[fsirl at enzo:/cvsx/bugs]$
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list