Viewing file: user-printf.c (1.45 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* Verify that calls to a function declared wiith attribute format (printf) don't get eliminated even if their result on success can be computed at compile time (they can fail). { dg-require-effective-target unwrapped } { dg-require-effective-target fileio } { dg-prune-output "warning: warning: \[^\n\r\]* possibly used unsafely" } { dg-skip-if "requires io" { avr-*-* } } { dg-skip-if "requires io" { freestanding } } */
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "gcc_tmpnam.h"
void __attribute__ ((format (printf, 1, 2), noipa)) user_print (const char *fmt, ...) { va_list va; va_start (va, fmt); vfprintf (stdout, fmt, va); va_end (va); }
int main (void) { char *tmpfname = gcc_tmpnam (0); FILE *f = freopen (tmpfname, "w", stdout); if (!f) { perror ("fopen for writing"); return 1; }
user_print ("1"); user_print ("%c", '2'); user_print ("%c%c", '3', '4'); user_print ("%s", "5"); user_print ("%s%s", "6", "7"); user_print ("%i", 8); user_print ("%.1s\n", "9x");
fclose (f);
f = fopen (tmpfname, "r"); if (!f) { perror ("fopen for reading"); remove (tmpfname); return 1; }
char buf[12] = ""; if (1 != fscanf (f, "%s", buf)) { perror ("fscanf"); fclose (f); remove (tmpfname); return 1; }
fclose (f); remove (tmpfname);
if (strcmp (buf, "123456789")) abort ();
return 0; }
|