Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test4_3_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 #include <errno.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include "mutatee_util.h"
36
37 /* Externally accessed function prototypes.  These must have globally unique
38  * names.  I suggest following the pattern <testname>_<function>
39  */
40
41 void test4_3_func1();
42
43 /* Global variables accessed by the mutator.  These must have globally unique
44  * names.
45  */
46
47 /* Internally used function prototypes.  These should be declared with the
48  * keyword static so they don't interfere with other mutatees in the group.
49  */
50
51 /* Global variables used internally by the mutatee.  These should be declared
52  * with the keyword static so they don't interfere with other mutatees in the
53  * group.
54  */
55
56 /* Function definitions follow */
57
58 unsigned int globalVariable3_1 = 0xdeadbeef;
59
60 void test4_3_func1() {
61   DUMMY_FN_BODY;
62 }
63
64 int test4_3_mutatee() {
65     int i;
66     char *ch;
67     char **newArgv;
68     /* gargc and gargv are declared as extern in solo_mutatee_boilerplate.c and
69      * defined in mutatee_driver.c
70      */
71     int argc = gargc;
72     char **argv = gargv;
73     size_t len, prefix, suffix; /* For building new strings */
74     char *start; /* The start of the mutatee executable filename */
75
76     newArgv = (char **) calloc(sizeof(char *), argc +1);
77     for (i = 0; i < argc; i++) newArgv[i] = argv[i];
78
79     /* Needs to find the name of the mutatee to run..  It needs to match the
80      * current mutatee in compiler and optimization level...
81      */
82     /* replace 'test4_3' in copy of myName by 'test4_3b' */
83     /* Verify that argv[0][0..6] matches 'test4_3' */
84     /* FIXME This check won't work..  There may be a prefix specifying the path
85      * that the executable is at
86      */
87     start = strstr(argv[0], "test4_3");
88     if (NULL == start) {
89       /* TODO Mismatch, this is an error */
90     }
91     /* I want to set newArgv to "test4_3b" + argv[7..] */
92     len = strlen(argv[0]) + 2; /* + 2 for extra character and NULL */
93     prefix = start - argv[0];
94     suffix = len - prefix - 8;
95     newArgv[0] = (char *) malloc(len * sizeof (char));
96     strncpy(newArgv[0], argv[0], prefix);
97     strncpy(newArgv[0] + prefix, "test4_3b", 8);
98     /* Copy the rest of argv[0] */
99     strncpy(newArgv[0] + prefix + 8, argv[0] + prefix + 7, suffix);
100
101 /*     newArgv[0] = strdup(argv[0]); */
102 /*     for (ch=newArgv[0]; *ch; ch++) { */
103 /*      if (!strncmp(ch, "4a", 2)) *(ch+1) = 'b'; */
104 /*     } */
105
106     /* Now I need to replace 'test4_3' on the command line (argument to -run)
107      * with 'test4_3b'
108      */
109     for (i = 1; i < argc; i++) {
110       /* Aw hell, I'm allowing comma-separated lists of tests to be specified
111        * as the argument to -run...  Is there any way I can just make sure that
112        * the right function gets called for the test4b mutatee no matter what?
113        * Yes there is: just replace any arguments to -run with test4_3b.  Duh
114        */
115       /* FIXME this may screw up if there's more than one '-run' specified */
116       if (strcmp(newArgv[i], "-run") == 0) {
117         newArgv[i + 1] = "test4_3b";
118       }
119     }
120
121     globalVariable3_1 = 3000001; 
122     dprintf("Starting \"%s\"\n", newArgv[0]);
123     errno = 0;
124     dprintf("Going into exec for %s...\n", newArgv[0]);
125     execvp(newArgv[0], newArgv);
126     perror("execvp");
127     return -1; /* Never reached */
128 }