1 | /* BZ #5424 */ |
2 | #include <stdio.h> |
3 | #include <errno.h> |
4 | #include <libc-diag.h> |
5 | |
6 | /* INT_MAX + 1 */ |
7 | #define N 2147483648 |
8 | |
9 | /* (INT_MAX / 2) + 2 */ |
10 | #define N2 1073741825 |
11 | |
12 | /* INT_MAX - 3 */ |
13 | #define N3 2147483644 |
14 | |
15 | #define STRINGIFY(S) #S |
16 | #define MAKE_STR(S) STRINGIFY(S) |
17 | |
18 | #define SN MAKE_STR(N) |
19 | #define SN2 MAKE_STR(N2) |
20 | #define SN3 MAKE_STR(N3) |
21 | |
22 | static int |
23 | do_test (void) |
24 | { |
25 | int ret; |
26 | |
27 | FILE *fp = fopen ("/dev/null" , "w" ); |
28 | if (fp == NULL) |
29 | { |
30 | puts (s: "cannot open /dev/null" ); |
31 | return 1; |
32 | } |
33 | |
34 | /* GCC 9 warns about output of more than INT_MAX characters; this is |
35 | deliberately tested here. */ |
36 | DIAG_PUSH_NEEDS_COMMENT; |
37 | #if __GNUC_PREREQ (7, 0) |
38 | DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=" ); |
39 | #endif |
40 | ret = fprintf (fp, "%" SN "d" , 1); |
41 | DIAG_POP_NEEDS_COMMENT; |
42 | printf (format: "ret = %d\n" , ret); |
43 | if (ret != -1 || errno != EOVERFLOW) |
44 | return 1; |
45 | |
46 | /* GCC 9 warns about output of more than INT_MAX characters; this is |
47 | deliberately tested here. */ |
48 | DIAG_PUSH_NEEDS_COMMENT; |
49 | #if __GNUC_PREREQ (7, 0) |
50 | DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=" ); |
51 | #endif |
52 | ret = fprintf (fp, "%." SN "d" , 1); |
53 | DIAG_POP_NEEDS_COMMENT; |
54 | printf (format: "ret = %d\n" , ret); |
55 | if (ret != -1 || errno != EOVERFLOW) |
56 | return 1; |
57 | |
58 | ret = fprintf (fp, "%." SN3 "d" , 1); |
59 | printf (format: "ret = %d\n" , ret); |
60 | if (ret != N3) |
61 | return 1; |
62 | |
63 | /* GCC 9 warns about output of more than INT_MAX characters; this is |
64 | deliberately tested here. */ |
65 | DIAG_PUSH_NEEDS_COMMENT; |
66 | #if __GNUC_PREREQ (7, 0) |
67 | DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=" ); |
68 | #endif |
69 | ret = fprintf (fp, "%" SN2 "d%" SN2 "d" , 1, 1); |
70 | DIAG_POP_NEEDS_COMMENT; |
71 | printf (format: "ret = %d\n" , ret); |
72 | |
73 | return ret != -1 || errno != EOVERFLOW; |
74 | } |
75 | |
76 | #define TIMEOUT 60 |
77 | #define TEST_FUNCTION do_test () |
78 | #include "../test-skeleton.c" |
79 | |