Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / snip_change_shlib_var.C
1 /*
2  * Copyright (c) 1996-2004 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  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // $Id
43 /*
44  * #Name: snip_change_shlib_var
45  * #Desc: use instrumentation to modify variable in shared library
46  * #Dep: 
47  * #Arch: sparc_sun_solaris2_4_test,i386_unknown_linux2_0_test,alpha_dec_osf4_0_test,ia64_unknown_linux2_4_test,x86_64_unknown_linux2_4_test
48  * #Notes: This test uses libNameA/B 
49  */
50
51 #include "BPatch.h"
52 #include "BPatch_Vector.h"
53 #include "BPatch_thread.h"
54 #include "BPatch_snippet.h"
55
56 #include "test_lib.h"
57 #include "dyninst_comp.h"
58
59 #ifdef os_windows_test
60 #define snprintf _snprintf
61 #endif
62
63
64 class snip_change_shlib_var_Mutator : public DyninstMutator {
65         const char *libNameAroot;
66         const char *libNameBroot;
67         char libNameA[128], libNameB[128];
68
69         public:
70         snip_change_shlib_var_Mutator();
71         virtual test_results_t executeTest();
72         virtual test_results_t mutatorTest();
73 };
74
75 snip_change_shlib_var_Mutator::snip_change_shlib_var_Mutator() : libNameAroot("libtestA"),
76                                                                            libNameBroot("libtestB") 
77 {
78 }
79
80 extern "C" DLLEXPORT  TestMutator *snip_change_shlib_var_factory() 
81 {
82         return new snip_change_shlib_var_Mutator();
83 }
84
85 test_results_t snip_change_shlib_var_Mutator::mutatorTest() 
86 {
87         //  The check function returns 1 on success (value changed as expected)
88         //  or 0 on failure.
89         const char *check_fname  = "check_snip_change_shlib_var";
90         const char *inst_func_name = "scsv1";
91         BPatch_Vector<BPatch_function *> funcs;
92
93         appImage->findFunction(inst_func_name, funcs);
94         if (!funcs.size())
95         {
96                 logerror("%s[%d]:  failed to find function %s\n", FILE__, __LINE__, inst_func_name);
97                 return FAILED;
98         }
99         BPatch_function *inst_func = funcs[0];
100         funcs.clear();
101
102         appImage->findFunction(check_fname, funcs);
103         if (!funcs.size())
104         {
105                 logerror("%s[%d]:  failed to find function %s\n", FILE__, __LINE__, check_fname);
106                 return FAILED;
107         }
108         BPatch_function *check_func = funcs[0];
109
110         const char *vname = "snip_change_shlib_var";
111         BPatch_variableExpr *v = appImage->findVariable(vname);
112         if (!v)
113         {
114                 logerror("%s[%d]:  could not find variable %s\n", FILE__, __LINE__);
115                 return FAILED;
116         }
117
118         BPatch_Vector<BPatch_point *> *pts      = inst_func->findPoint(BPatch_entry);
119         if (!pts || !pts->size())
120         {
121                 logerror("%s[%d]:   failed to find entry point to %s\n", 
122                                 FILE__, __LINE__, inst_func_name);
123                 return FAILED;
124         }
125         BPatch_point *entry_point = (*pts)[0];
126
127         pts     = inst_func->findPoint(BPatch_exit);
128         if (!pts || !pts->size())
129         {
130                 logerror("%s[%d]:   failed to find exit point to %s\n", 
131                                 FILE__, __LINE__, inst_func_name);
132                 return FAILED;
133         }
134
135         BPatch_point *exit_point  = (*pts)[0];
136
137         const char *check_res_name = "gv_scsv1";
138         BPatch_variableExpr *check_result = appImage->findVariable(check_res_name);
139         if (!check_result)
140         {
141                 logerror("%s[%d]:  failed to find var %s\n", FILE__, __LINE__, check_res_name);
142                 return FAILED;
143         }
144
145         //  Snippet to assign new value to var in shared lib
146         //  inserted at entry of inst_func
147         BPatch_constExpr newval(777);
148         BPatch_arithExpr my_ass(BPatch_assign, *v, newval);
149
150         if (!appAddrSpace->insertSnippet(my_ass, *entry_point))
151         {
152                 logerror("%s[%d]:  failed to insert snippet\n", FILE__, __LINE__);
153                 return FAILED;
154         }
155
156         //  Snippet to call function in shared lib that checks the value of 
157         //  the variable that should have been properly changed.
158         //  Return value is assigned to global var in mutatee 
159         //  inserted at the exit of inst_func
160
161         BPatch_Vector<BPatch_snippet *> check_args;
162         BPatch_funcCallExpr checkCall(*check_func, check_args);
163         BPatch_arithExpr checkRes(BPatch_assign, *check_result, checkCall);
164
165         if (!appAddrSpace->insertSnippet(checkRes, *exit_point))
166         {
167                 logerror("%s[%d]:  failed to insert snippet\n", FILE__, __LINE__);
168                 return FAILED;
169         }
170
171         return PASSED;
172 }
173
174 test_results_t snip_change_shlib_var_Mutator::executeTest() 
175 {
176         int pointer_size = 0;
177 #if defined(arch_x86_64_test) || defined(ppc64_linux_test)
178         pointer_size = pointerSize(appImage);
179 #endif
180         strncpy(libNameA, libNameAroot, 128);
181         addLibArchExt(libNameA,128, pointer_size);
182         strncpy(libNameB, libNameBroot, 128);
183         addLibArchExt(libNameB,128, pointer_size);
184
185         char libA[128], libB[128];
186         snprintf(libA, 128, "./%s", libNameA);
187         snprintf(libB, 128, "./%s", libNameB);
188
189         if (! appAddrSpace->loadLibrary(libA)) 
190         {
191                 logerror("**Failed snip_change_shlib_var (findFunction in module)\n");
192                 logerror("  Mutator couldn't load %s into mutatee\n", libNameA);
193                 return FAILED;
194         }
195
196         if (! appAddrSpace->loadLibrary(libB)) 
197         {
198                 logerror("**Failed snip_change_shlib_var (findFunction in module)\n");
199                 logerror("  Mutator couldn't load %s into mutatee\n", libNameB);
200                 return FAILED;
201         }
202
203         return mutatorTest();
204 } // snip_change_shlib_var_Mutator::executeTest()
205