1
2 '''
3 Mutators that operate on the size relation.
4
5 @author: Michael Eddington
6 @version: $Id$
7 '''
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 import sys, os, time
37
38 from Peach.Generators.block import *
39 from Peach.Generators.data import *
40 from Peach.Generators.dictionary import *
41 from Peach.Generators.flipper import *
42 from Peach.Generators.static import Static, _StaticFromTemplate, _StaticCurrentValueFromDom
43 from Peach.Transformers.encode import WideChar
44 from Peach import Transformers
45 from Peach.Generators.block import *
46 from Peach.Generators.data import *
47 from Peach.Generators.dictionary import *
48 from Peach.Generators.flipper import *
49 from Peach.Generators.static import Static, _StaticFromTemplate
50 from Peach.Transformers.encode import WideChar
51 from Peach.mutator import *
52 from Peach.group import *
53 from Peach.Engine.common import *
54
56 '''
57 Keep the size field same, but change "of" data length.
58 '''
59
61 Mutator.__init__(self)
62
63 self.name = "OfEdgeCasesMutator"
64 self._peach = peach
65
66 self._stateMasterCount = -1
67 self._masterGroup = GroupSequence()
68 self._masterCount = 0
69 self._countThread = None
70 self._countGroup = GroupSequence()
71 self._actions = []
72
73
74 self._activeGroups = []
75
76
77 self._generatorMap = {}
78 self._countGeneratorMap = {}
79
81 '''
82 Some mutators could contine forever, this
83 should indicate.
84 '''
85 return True
86
88 '''
89 Reset mutator
90 '''
91
92 self._masterGroup = GroupSequence()
93 self._activeGroups = []
94 self._generatorMap = {}
95 self._masterCount = 0
96 self._actions = []
97
99 '''
100 Goto next mutation. When this is called
101 the state machine is updated as needed.
102 '''
103
104 try:
105
106
107
108
109 if self._stateMasterCount > -1:
110 for cnt in xrange(self._masterCount, self._stateMasterCount):
111 self._masterGroup.next()
112 self._masterCount += 1
113 self._stateMasterCount = -1
114 else:
115 self._masterGroup.next()
116 self._masterCount += 1
117
118 except GroupCompleted:
119 raise MutatorCompleted()
120
122 '''
123 Return a binary string that contains
124 any information about current state of
125 Mutator. This state information should be
126 enough to let the same mutator "restart"
127 and continue when setState() is called.
128 '''
129
130
131 return str(self._masterCount - 2)
132
134 '''
135 Set the state of this object. Should put us
136 back in the same place as when we said
137 "getState()".
138 '''
139 self._stateMasterCount = int(state)
140 try:
141 self.next()
142 except:
143 pass
144
146 if self._countThread != None and self._countThread.hasCountEvent.isSet():
147 self._count = self._countThread.count
148 self._countThread = None
149 self._countGroup = None
150 self._countGeneratorMap = None
151
152 return self._count
153
166
168
169 elements = []
170
171 for e in node._children:
172 if e.elementType == 'string' and not e.isStatic:
173 elements.append(e)
174
175 if e.hasChildren:
176 for ee in self._getStringElements(e):
177 elements.append(ee)
178
179 return elements
180
181
182
183
211
214
217
218
219
220
221
224
227
230
233
236
238
239
240 if self._count == -1 and self._countThread == None:
241 self._countThread = MutatorCountCalculator(self)
242 self._countThread.start()
243
244 elif self._countThread != None:
245 if self._countThread.hasCountEvent.isSet():
246 self._count = self._countThread.count
247 self._countThread = None
248 self._countGroup = None
249 self._countGeneratorMap = None
250
251
252
253