Memory leak fixes and stopped tracking topped locations.
[dyninst.git] / dyninstAPI / src / StackMod / StackModChecker.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #ifndef _StackModChecker_h_
32 #define _StackModChecker_h_
33
34 #include "BPatch_function.h"
35
36 #include "Instruction.h"
37
38 #include "dyninstAPI/src/function.h"
39 #include "StackMod.h"
40 #include "StackModExpr.h"
41
42 class StackModChecker
43 {
44     public:
45         StackModChecker(BPatch_function* b, func_instance* f) :
46             bfunc(b),
47             func(f),
48             _unsafeStackGrowth(false) {}
49         ~StackModChecker();
50
51         bool addModsInternal(std::set<StackMod*>);
52
53     private:
54         BPatch_function* bfunc;
55         func_instance* func;
56
57     private:
58         typedef map<int, pair<int, StackMod::MType> > rangeMap;
59         typedef rangeMap::iterator rangeIterator;
60
61         std::string getName() const;
62
63         bool accumulateStackRanges(StackMod* m);
64         bool alignStackRanges(int alignment, StackMod::MOrder order, std::vector<StackMod*>& mods);
65         void findContiguousRange(rangeIterator iter, rangeIterator& end);
66         
67         bool checkStackGrowth(Dyninst::StackAnalysis& sa); 
68         void processBlock(Dyninst::StackAnalysis& sa, Dyninst::ParseAPI::Block* block);
69         bool checkAllPaths(Dyninst::StackAnalysis& sa);
70         bool checkAllPathsInternal(Dyninst::ParseAPI::Block* block, 
71                 std::set<Dyninst::ParseAPI::Block*>& state,
72                 std::vector<Dyninst::ParseAPI::Block*>& path,
73                 std::set<Dyninst::ParseAPI::Block*>& exitBlocks,
74                 Dyninst::StackAnalysis& sa);
75         bool checkPath(std::vector<Dyninst::ParseAPI::Block*>& path);
76         
77         bool findInsertOrRemovePoints(Dyninst::StackAnalysis& sa, StackMod* m, std::vector<BPatch_point*>*& points, long& dispFromRSP);
78         bool checkInsn(Dyninst::ParseAPI::Block* block, Dyninst::Offset off, int loc, Dyninst::StackAnalysis& sa, BPatch_point*& point, long& dispFromRSP);
79         bool findCanaryPoints(std::vector<BPatch_point*>* insertPoints,
80             std::vector<BPatch_point*>* checkPoints);
81         
82         bool areModificationsSafe();
83         bool isAccessSafe(Dyninst::InstructionAPI::Instruction::Ptr insn, StackAccess* access);
84         
85         bool _unsafeStackGrowth;
86         
87         std::map<Dyninst::ParseAPI::Block*, std::vector<Dyninst::StackAnalysis::Height>* > blockHeights;
88
89         rangeMap _stackRanges;
90         rangeMap _stackRangesCleanup;
91 };
92
93 #endif