summaryrefslogtreecommitdiff
path: root/support/regression/tcc/112_backtrace.c
blob: 8489bd32a65f86fcadb9ae6b6cd56e8f5fd33d02 (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <stdio.h>

/* ------------------------------------------------------- */
#if defined test_backtrace_1

void f3()
{
    printf("* f3()\n"), fflush(stdout);
    *(void**)0 = 0;
}
void f2()
{
    printf("* f2()\n"), fflush(stdout);
    f3();
}
void f1()
{
    printf("* f1()\n"), fflush(stdout);
    f2();
}
int main(int argc, char **argv)
{
    printf("* main\n"), fflush(stdout);
    f1();
    printf("* exit main\n"), fflush(stdout);
    return 0;
}

/* ------------------------------------------------------- */
#elif defined test_bcheck_1

struct s { int a,b,c,d,e; };
struct s s[3];
struct s *ps = s;
void f1()
{
    printf("* f1()\n"), fflush(stdout);
    ps[3] = ps[2];
}
int main(int argc, char **argv)
{
    printf("* main\n"), fflush(stdout);
    f1();
    printf("* exit main\n"), fflush(stdout);
    return 0;
}

/* ------------------------------------------------------- */
#elif defined test_tcc_backtrace_2

/* test custom backtrace and 'exit()' redirection */
int tcc_backtrace(const char *fmt, ...);
void exit(int);

void f2()
{
    printf("* f2()\n");
    printf("* exit f2\n"), fflush(stdout);
    exit(34);
}
void f1()
{
    printf("* f1()\n"), fflush(stdout);
    tcc_backtrace("Hello from %s!", "f1");
    f2();
}
int main(int argc, char **argv)
{
    printf("* main\n"), fflush(stdout);
    f1();
    printf("* exit main\n"), fflush(stdout);
    return 0;
}

/* ------------------------------------------------------- */
#elif defined test_tcc_backtrace_3

/* this test should be run despite of the exit(34) above */
int main(int argc, char **argv)
{
    printf("* main\n"), fflush(stdout);
    return 1;
}

/* ------------------------------------------------------- */
#else
#include <stdlib.h>
#include <string.h>
char *strdup();
int main()
{
    char pad1[10];
    char a[10];
    char pad2[10];
    char b[10];
    char pad3[10];
    memset (pad1, 0, sizeof(pad1));
    memset (pad2, 0, sizeof(pad2));
    memset (pad3, 0, sizeof(pad3));

    memset (a, 'a', 10);
    a[3] = 0;
    a[9] = 0;
    memset (b, 'b', 10);

#if defined test_bcheck_100
    memcpy(&a[1],&b[0],10);
#elif defined test_bcheck_101
    memcpy(&a[0],&b[1],10);
#elif defined test_bcheck_102
    memcpy(&a[0],&a[3],4);
#elif defined test_bcheck_103
    memcpy(&a[3],&a[0],4);
#elif defined test_bcheck_104
    memcmp(&b[1],&b[0],10);
#elif defined test_bcheck_105
    memcmp(&b[0],&b[1],10);
#elif defined test_bcheck_106
    memmove(&b[1],&b[0],10);
#elif defined test_bcheck_107
    memmove(&b[0],&b[1],10);
#elif defined test_bcheck_108
    memset(&b[1],'b',10);
#elif defined test_bcheck_109
    strlen(&b[0]);
#elif defined test_bcheck_110
    strcpy(&a[7], &a[0]);
#elif defined test_bcheck_111
    strcpy(&a[0], &b[7]);
#elif defined test_bcheck_112
    strcpy(&a[0], &a[1]);
#elif defined test_bcheck_113
    strcpy(&a[2], &a[0]);
#elif defined test_bcheck_114
    strncpy(&a[7], &a[0], 10);
#elif defined test_bcheck_115
    strncpy(&a[0], &b[7], 10);
#elif defined test_bcheck_116
    strncpy(&a[0], &a[1], 10);
#elif defined test_bcheck_117
    strncpy(&a[2], &a[0], 10);
#elif defined test_bcheck_118
    strcmp(&b[2], &b[0]);
#elif defined test_bcheck_119
    strcmp(&b[0], &b[2]);
#elif defined test_bcheck_120
    strncmp(&b[5], &b[0], 10);
#elif defined test_bcheck_121
    strncmp(&b[0], &b[5], 10);
#elif defined test_bcheck_122
    strcat(&a[7], &a[0]);
#elif defined test_bcheck_123
    strcat(&a[0], &b[3]);
#elif defined test_bcheck_124
    strcat(&a[0], &a[4]);
#elif defined test_bcheck_125
    strcat(&a[3], &a[0]);
#elif defined test_bcheck_126
    strchr(&b[0], 'a');
#elif defined test_bcheck_127
    free(strdup(&b[0]));
#endif
}
/* ------------------------------------------------------- */
#endif