This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
c/2574: sprintf(..) can not correctly handle "%%"
- To: gcc-gnats at gcc dot gnu dot org
- Subject: c/2574: sprintf(..) can not correctly handle "%%"
- From: zj at speech dot sri dot com
- Date: 17 Apr 2001 23:30:10 -0000
- Reply-To: zj at speech dot sri dot com
>Number: 2574
>Category: c
>Synopsis: sprintf(..) can not correctly handle "%%"
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Apr 17 16:36:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: gcc/g++
>Release: version 2.95.2 19991024 (release)
>Organization:
>Environment:
solaris, SunOS 5.6 5.7
>Description:
The sprintf(...) could not handle "%%" correctly.
sprintf(buf, "%%") does not produce "%" in buffer, instead,
"%%" is handled as "%". This does not happen in printf(..)
>How-To-Repeat:
Just compile it and run the binary. It happens everytime.
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/plain; name="test_sprintf.i"
Content-Disposition: inline; filename="test_sprintf.i"
# 1 "test_sprintf.c"
# 1 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 1 3
#pragma ident "@(#)stdio.h 1.49 97/05/09 SMI"
# 1 "/usr/include/sys/feature_tests.h" 1 3
#pragma ident "@(#)feature_tests.h 1.13 97/06/26 SMI"
# 17 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 2 3
# 1 "/usr/include/sys/va_list.h" 1 3
#pragma ident "@(#)va_list.h 1.6 96/01/26 SMI"
# 41 "/usr/include/sys/va_list.h" 3
typedef void *__va_list;
# 18 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 2 3
typedef unsigned int size_t;
# 52 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
# 66 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
typedef long fpos_t;
# 127 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
typedef struct
{
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
unsigned char _flag;
unsigned char _file;
} FILE;
extern FILE __iob[60 ];
extern FILE *_lastbuf;
extern unsigned char *_bufendtab[];
extern unsigned char _sibuf[], _sobuf[];
# 227 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
extern int remove(const char *);
extern int rename(const char *, const char *);
extern FILE *tmpfile(void);
extern char *tmpnam(char *);
extern int fclose(FILE *);
extern int fflush(FILE *);
extern FILE *fopen(const char *, const char *);
extern FILE *freopen(const char *, const char *, FILE *);
extern void setbuf(FILE *, char *);
extern void setbuffer(FILE *, char *, size_t);
extern int setlinebuf(FILE *);
extern int setvbuf(FILE *, char *, int, size_t);
extern int fprintf(FILE *, const char *, ...);
extern int fscanf(FILE *, const char *, ...);
extern int printf(const char *, ...);
extern int scanf(const char *, ...);
extern int snprintf(char *, size_t, const char *, ...);
extern int sprintf(char *, const char *, ...);
extern int sscanf(const char *, const char *, ...);
extern int vfprintf(FILE *, const char *, __va_list);
extern int vprintf(const char *, __va_list);
extern int vsnprintf(char *, size_t, const char *, __va_list);
extern int vsprintf(char *, const char *, __va_list);
extern int fgetc(FILE *);
extern char *fgets(char *, int, FILE *);
extern int fputc(int, FILE *);
extern int fputs(const char *, FILE *);
extern int getc(FILE *);
extern int getchar(void);
extern char *gets(char *);
extern int putc(int, FILE *);
extern int putchar(int);
extern int puts(const char *);
extern int ungetc(int, FILE *);
extern size_t fread(void *, size_t, size_t, FILE *);
extern size_t fwrite(const void *, size_t, size_t, FILE *);
extern int fgetpos(FILE *, fpos_t *);
extern int fseek(FILE *, long, int);
extern int fsetpos(FILE *, const fpos_t *);
extern long ftell(FILE *);
extern void rewind(FILE *);
extern void clearerr(FILE *);
extern int feof(FILE *);
extern int ferror(FILE *);
extern void perror(const char *);
extern int __filbuf(FILE *);
extern int __flsbuf(int, FILE *);
extern FILE *fdopen(int, const char *);
extern char *ctermid(char *);
extern int fileno(FILE *);
# 324 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
extern FILE *popen(const char *, const char *);
extern char *cuserid(char *);
extern char *tempnam(const char *, const char *);
extern int getopt(int, char *const *, const char *);
extern int getsubopt(char **, char *const *, char **);
extern char *optarg;
extern int optind, opterr, optopt;
extern int getw(FILE *);
extern int putw(int, FILE *);
extern int pclose(FILE *);
# 367 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
# 472 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
# 520 "/usr/local/lib/gcc-lib/i386-unknown-solaris2.5.1/2.7.2.1-repo/incl5.6/stdio.h" 3
# 1 "test_sprintf.c" 2
void main()
{
char * PERCENT = "%%";
char buffer[1024];
float a = 1.23;
printf("%.2f%% error\n", a);
sprintf(buffer, "%.2f%% error\n", a);
printf(buffer);
sprintf(buffer, "%.2f%s error\n", a, PERCENT);
printf(buffer);
}