standards/65779: Potential bug in printf positional parameters
Jonathan McGee
mcgee at wam.umd.edu
Mon Apr 19 12:20:18 PDT 2004
>Number: 65779
>Category: standards
>Synopsis: Potential bug in printf positional parameters
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-standards
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Apr 19 12:20:17 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator: Jonathan McGee
>Release: FreeBSD 5.2.1-RELEASE-p4 i386
>Organization:
>Environment:
System: FreeBSD freebie 5.2.1-RELEASE-p4 FreeBSD 5.2.1-RELEASE-p4 #0: Tue Apr 13 06:05:44 EDT 2004 root at freebie:/usr/obj/usr/src/sys/FREEBIE i386
System is build by user with CFLAGS="-O3 -pipe", CPU="p3". After the problem
was found, it was retried with CFLAGS="-O0 -g" with no change in the
behavior.
>Description:
While working on a port, found a potential issue with positional parameters in
FreeBSD's libc. It seems that both sprintf and printf (the only two functions
tested) are not honoring the positional argument flags.
A minimum test case was written and attached (test-libc.c). When built, four
integers (1, 2, 3, 4) are passed to a positional printf that should display
them in order, skipping the second.
When executed, the output expected is:
1 3 4
1 3 4
Instead, I get:
1 2 3
1 2 3
It seems rather sensitive to the ordering of printf and sprintf calls. I can
swap them and get different behaviors (occasionally one may work).
>How-To-Repeat:
See attached test-libc.c
>Fix:
--- test-libc.c begins here ---
#include <stdio.h>
int main() {
int int1 = 1;
int int2 = 2;
int int3 = 3;
int int4 = 4;
char buffer[200];
char *format = "%1$i %3$i %4$i\n";
printf(format, int1, int2, int3, int4);
sprintf(buffer, format, int1, int2, int3, int4);
printf("%s", buffer);
return 0;
}
--- test-libc.c ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-standards
mailing list