Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / tests / src / test3.mutatee.c
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 /* Test application (Mutatee) */
33
34 /* $Id: test3.mutatee.c,v 1.17 2008/03/12 20:09:29 legendre Exp $ */
35
36 #include <stdio.h>
37 #include <assert.h>
38 #include <sys/types.h>
39 #include <signal.h>
40 #include <string.h>
41 #include <stdlib.h>
42
43 #if defined(i386_unknown_nt4_0) && !defined(__GNUC__)
44 #define WIN32_LEAN_AND_MEAN
45 #include <windows.h>
46 #include <process.h>
47 #define getpid _getpid
48 #else
49 #include <unistd.h>
50 #endif
51
52 #if defined(sparc_sun_solaris2_4) || defined(alpha_dec_osf4_0)
53 #include <dlfcn.h> /* For replaceFunction test */
54 #endif
55
56 #ifdef __cplusplus
57 int mutateeCplusplus = 1;
58 #else
59 int mutateeCplusplus = 0;
60 #endif
61
62 #ifndef COMPILER
63 #define COMPILER ""
64 #endif
65 const char *Builder_id=COMPILER; /* defined on compile line */
66
67 /* Mutatee for multi-process tests.
68  */
69
70 /* control debug printf statements */
71 #define dprintf if (debugPrint) printf
72 int debugPrint = 0;
73
74 #define TRUE    1
75 #define FALSE   0
76
77 #define MAX_TEST 5
78
79 /* 
80  * Test #1 - just run indefinitely (to be killed by mutator)
81  */
82 void test1()
83 {
84      dprintf("Mutatee spinning.\n");
85      while (1);
86 }
87
88 /* 
89  * Test #2 - just run in a busy wait loop and then exit.
90  */
91 void test2()
92 {
93      int i;
94
95      for (i=0; i < 2000000; i++);
96      dprintf("Mutatee exiting.\n");
97      exit(0);
98 }
99
100 int test3ret = (int)0xdeadbeef;
101
102 volatile int dummy = 1;
103
104 void call3_1(int arg1, int arg2)
105 {
106      dprintf("call3_1() called with arg1=%d,arg2=%d\n", arg1, arg2);
107 }
108
109 int func3_1()
110 {
111      return (dummy * 2);
112 }
113
114 #include <errno.h>
115 /*
116  * Test #3 - call a function which should be instrumented to set the 
117  *     global variable test3ret to a value (by the mutator).
118  */
119 void test3()
120 {
121      FILE *fp;
122      char filename[80];
123
124      func3_1();
125
126      sprintf(filename, "test3.out.%d", (int)getpid());
127      fp = fopen(filename, "w");
128      if (!fp) {
129         fprintf(stderr, "%s[%d]:  failed to fopen %s: %s\n", __FILE__, __LINE__, filename, strerror(errno));
130      }
131      assert(fp);
132      fprintf(fp, "%d\n", test3ret);
133      fclose(fp);
134 }
135
136 /* 
137  * Test #5 - terminate with an abort
138  */
139 void test5()
140 {
141      dprintf("Mutatee aborting.\n");
142      abort();
143 }
144
145 unsigned int test7counter = 0;
146 void call7_1()
147 {
148   test7counter++;
149 }
150
151
152 int main(int iargc, char *argv[])
153 {                                       /* despite different conventions */
154     unsigned argc=(unsigned)iargc;      /* make argc consistently unsigned */
155     unsigned int i;
156     unsigned int testNum=0;
157
158     for (i=1; i < argc; i++) {
159         if (!strcmp(argv[i], "-verbose")) {
160             debugPrint = TRUE;
161         } else if (!strcmp(argv[i], "-run")) {
162             if ((testNum = atoi(argv[i+1]))) {
163                 if ((testNum <= 0) || (testNum > MAX_TEST)) {
164                     printf("invalid test %d requested\n", testNum);
165                     exit(-1);
166                 }
167             } else {
168                 /* end of test list */
169                 break;
170             }
171             i++;
172         } else {
173             fprintf(stderr, "Usage: %s [-verbose] -run <num>\n", argv[0]);
174             exit(-1);
175         }
176     }
177
178     if ((argc==1) || debugPrint)
179         printf("Mutatee %s [%s]:\"%s\"\n", argv[0], 
180                 mutateeCplusplus ? "C++" : "C", Builder_id);
181     if (argc==1) exit(0);
182
183     switch (testNum) {
184         case 1:
185                 test1();
186                 break;
187         
188         case 2:
189                 test2();
190                 break;
191         
192         case 3:
193                 test3();
194                 break;
195
196         /* subtest 4 uses test2()! */
197
198         case 5:
199                 test5();
200                 break;
201
202         default:
203                 printf("invalid test number %d in mutatee\n", testNum);
204                 break;
205     }
206     dprintf("Mutatee %s terminating.\n", argv[0]);
207     return(0);
208 }