• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* Ltrace Test : parameters.c.
2     Objectives  : Verify that Ltrace can handle all the different
3     parameter types
4  
5     This file was written by Steve Fink <sphink@gmail.com>. */
6  
7  #include <stdio.h>
8  #include <unistd.h>
9  #include <sys/syscall.h>
10  #include <sys/stat.h>
11  #include <errno.h>
12  #include <string.h>
13  #include <stdlib.h>
14  
15  void func_intptr(int *i);
16  void func_intptr_ret(int *i);
17  int func_strlen(char*);
18  void func_strfixed(char*);
19  void func_ppp(int***);
20  void func_stringp(char**);
21  void func_short(short, short);
22  void func_ushort(unsigned short, unsigned short);
23  float func_float(float, float);
24  double func_double(double, double);
25  void func_arrayi(int*, int);
26  void func_arrayf(float*, int);
27  void func_struct(void*);
28  
29  typedef enum {
30    RED,
31    GREEN,
32    BLUE,
33    CHARTREUSE,
34    PETUNIA
35  } color_t;
36  void func_enum(color_t);
37  void func_typedef(color_t);
38  
39  void func_work(char *x);
40  void func_call(char *x, char *y, void (*cb)(char *));
41  
42  void
call_func_work(char * x)43  call_func_work (char *x)
44  {
45  	func_work(x);
46  }
47  
48  int
main()49  main ()
50  {
51    int x = 17;
52    int *xP, **xPP;
53    char buf[200];
54    char *s;
55    int *ai;
56    float *af;
57  
58    func_intptr(&x);
59  
60    func_intptr_ret(&x);
61  
62    func_string("zero\0xxxxxxxxxxxxxx");
63    func_strlen(buf);
64  
65    extern int func_arg0(char *);
66    func_arg0(buf);
67  
68    printf("%s\n", buf);
69  
70    func_strfixed(buf);
71    printf("%s\n", buf);
72  
73    x = 80;
74    xP = &x;
75    xPP = &xP;
76    func_ppp(&xPP);
77  
78    s = (char*) malloc(100);
79    strcpy(s, "Dude");
80    func_stringp(&s);
81  
82    func_enum(BLUE);
83  
84    func_short(-8, -9);
85    func_ushort(33, 34);
86    float f = func_float(3.4, -3.4);
87    double d = func_double(3.4, -3.4);
88  
89    func_typedef(BLUE);
90  
91    ai = (int*) calloc(sizeof(int), 8);
92    for (x = 0; x < 8; x++)
93      ai[x] = 10 + x;
94    func_arrayi(ai, 8);
95    func_arrayi(ai, 2);
96  
97    af = (float*) calloc(sizeof(float), 8);
98    for (x = 0; x < 8; x++)
99      af[x] = 10.1 + x;
100    func_arrayf(af, 8);
101    func_arrayf(af, 2);
102  
103    {
104      struct {
105        int simple;
106        int alen;
107        int slen;
108        struct { int a; int b; }* array;
109        struct { int a; int b; } seq[3];
110        char* str;
111      } x;
112  
113      x.simple = 89;
114  
115      x.alen = 2;
116      x.array = malloc(800);
117      x.array[0].a = 1;
118      x.array[0].b = 10;
119      x.array[1].a = 3;
120      x.array[1].b = 30;
121  
122      x.seq[0].a = 4;
123      x.seq[0].b = 40;
124      x.seq[1].a = 5;
125      x.seq[1].b = 50;
126      x.seq[2].a = 6;
127      x.seq[2].b = 60;
128  
129      x.slen = 3;
130      x.str = "123junk";
131  
132      func_struct(&x);
133    }
134  
135    {
136      char x[10] = {};
137      char y[10] = {};
138      func_call(x, y, call_func_work);
139    }
140  
141    struct S2 {
142      float f;
143      char a;
144      char b;
145    };
146    struct S3 {
147      char a[6];
148      float f;
149    };
150    struct S2 func_struct_2(int, struct S3 s3, double d);
151    func_struct_2(17, (struct S3){ "ABCDE", 0.25 }, 0.5);
152  
153    struct S4 {
154      long a;
155      long b;
156      long c;
157      long d;
158    };
159    struct S4 func_struct_large(struct S4 a, struct S4 b);
160    func_struct_large((struct S4){ 1, 2, 3, 4 }, (struct S4){ 5, 6, 7, 8 });
161  
162    struct S5 {
163      char a;
164      char b;
165      long c;
166      long d;
167    };
168    struct S5 func_struct_large2(struct S5 a, struct S5 b);
169    func_struct_large2((struct S5){ '0', '1', 3, 4 }, (struct S5){ '2', '3', 7, 8 });
170  
171    struct S6 {
172      long a;
173      long b;
174      char c;
175      char d;
176    };
177    struct S6 func_struct_large3(struct S6 a, struct S6 b);
178    func_struct_large3((struct S6){ 3, 4, '0', '1' }, (struct S6){ 7, 8 ,'2', '3' });
179  
180    void func_many_args(int a, int b, long c, double d, char e, int f, float g,
181  		      char h, int i, double j, int k, double l, char m, int n,
182  		      short o, int p, char q, float r, float s, double t,
183  		      long u, float v, float w, float x, float y);
184    func_many_args(1, 2, 3, 4.0, '5', 6, 7.0,
185  		 '8', 9, 10.0, 11, 12.0, 'A', 14,
186  		 15, 16, 'B', 18.0, 19.0, 20.0,
187  		 21, 22.0, 23.0, 24.0, 25.0);
188  
189    void func_printf(char *format, ...);
190    func_printf("sotnuh %d %ld %g %c\n", 5, 6L, 1.5, 'X');
191    func_printf("sotnuh1 %d %ld %hd\n", 5, 6L, (short)7);
192    func_printf("sotnuh2 %s %10s %10s\n", "a string", "a trimmed string", "short");
193    func_printf("many_args"
194  	 "%d %d %ld %g %c %d %g "
195  	 "%c %d %g %d %g %c %d "
196  	 "%hd %d %c %g %g %g "
197  	 "%ld %g %g %g %g",
198  	 1, 2, 3L, 4.0, '5', 6, 7.0,
199  	 '8', 9, 10.0, 11, 12.0, 'A', 14,
200  	 (short)15, 16, 'B', 18.0, 19.0, 20.0,
201  	 21L, 22.0, 23.0, 24.0, 25.0);
202  
203    func_printf("sotnuh3 %*s\n", 4, "a trimmed string");
204  
205    void func_sprintf(char *str, char *format, ...);
206    func_sprintf(NULL, "test %d %d %d %d\n", 1, 2, 3, 4);
207  
208    void func_lens(int, long, short, long);
209    func_lens(22, 23, 24, 25);
210  
211    int func_bool(int a, int b);
212    func_bool(1, 10);
213    func_bool(2, 0);
214  
215    void func_hide(int a, int b, int c, int d, int e, int f, int g, int h);
216    func_hide(1, 2, 3, 4, 5, 6, 7, 8);
217  
218    struct func_hide_struct {
219  	  int a; int b; int c; int d; int e; int f; int g; int h;
220    };
221    void func_hide_struct(struct func_hide_struct hs);
222    func_hide_struct((struct func_hide_struct){1, 2, 3, 4, 5, 6, 7, 8});
223  
224    enum ab { A, B };
225    long *func_short_enums(short abs[]);
226    func_short_enums((short[]){ A, B, A, A });
227  
228    long func_negative_enum(short a, unsigned short b, int c, unsigned d,
229                           long e, unsigned long f);
230    func_negative_enum(-1, -1, -1, -1, -1, -1);
231  
232    void func_charp_string(char *p);
233    func_charp_string("null-terminated string");
234  
235    struct struct_empty {};
236    struct struct_empty func_struct_empty(struct struct_empty e);
237    func_struct_empty((struct struct_empty) {});
238  
239    struct struct_size1 { char a; };
240    struct struct_size1 func_struct_size1(struct struct_size1 e);
241    func_struct_size1((struct struct_size1){ '5' });
242  
243    struct struct_size2 { short a; };
244    struct struct_size2 func_struct_size2(struct struct_size2 e);
245    func_struct_size2((struct struct_size2){ 5 });
246  
247    struct struct_size4 { int a; };
248    struct struct_size4 func_struct_size4(struct struct_size4 e);
249    func_struct_size4((struct struct_size4){ 5 });
250  
251    struct struct_size8 { int a; int b; };
252    struct struct_size8 func_struct_size8(struct struct_size8 e);
253    func_struct_size8((struct struct_size8){ 5, 6 });
254  
255    return 0;
256  }
257