1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
/* Copyright (C) 2000, 2001 Free Software Foundation.
Ensure all expected transformations of builtin fputs occur and that
we honor side effects in the stream argument.
Written by Kaveh R. Ghazi, 10/30/2000. */
#include <stdio.h>
extern void abort(void);
int i;
void
main_test(void)
{
FILE *s_array[] = {stdout, NULL}, **s_ptr = s_array;
const char *const s1 = "hello world";
fputs ("", *s_ptr);
fputs ("\n", *s_ptr);
fputs ("bye", *s_ptr);
fputs (s1, *s_ptr);
fputs (s1+5, *s_ptr);
fputs (s1+10, *s_ptr);
fputs (s1+11, *s_ptr);
/* Check side-effects when transforming fputs -> NOP. */
fputs ("", *s_ptr++);
if (s_ptr != s_array+1 || *s_ptr != 0)
abort();
/* Check side-effects when transforming fputs -> fputc. */
s_ptr = s_array;
fputs ("\n", *s_ptr++);
if (s_ptr != s_array+1 || *s_ptr != 0)
abort();
/* Check side-effects when transforming fputs -> fwrite. */
s_ptr = s_array;
fputs ("hello\n", *s_ptr++);
if (s_ptr != s_array+1 || *s_ptr != 0)
abort();
/* Test at least one instance of the __builtin_ style. We do this
to ensure that it works and that the prototype is correct. */
s_ptr = s_array;
__builtin_fputs ("", *s_ptr);
/* These builtin stubs are called by __builtin_fputs, ensure their
prototypes are set correctly too. */
__builtin_fputc ('\n', *s_ptr);
__builtin_fwrite ("hello\n", 1, 6, *s_ptr);
/* Check the unlocked style, these evaluate to nothing to avoid
problems on systems without the unlocked functions. */
fputs_unlocked ("", *s_ptr);
__builtin_fputs_unlocked ("", *s_ptr);
/* Check side-effects in conditional expression. */
s_ptr = s_array;
fputs (i++ ? "f" : "x", *s_ptr++);
if (s_ptr != s_array+1 || *s_ptr != 0 || i != 1)
abort();
fputs (--i ? "\n" : "\n", *--s_ptr);
if (s_ptr != s_array || i != 0)
abort();
}
|