`class PossibleValueSet` PossibleValueSet is used to define possible values that a variable can take. It contains methods to instantiate different value sets such as Constant, Signed/Unsigned Ranges, etc.
| 253 | |
| 254 | @decorators.passive |
| 255 | class PossibleValueSet: |
| 256 | """ |
| 257 | `class PossibleValueSet` PossibleValueSet is used to define possible values |
| 258 | that a variable can take. It contains methods to instantiate different |
| 259 | value sets such as Constant, Signed/Unsigned Ranges, etc. |
| 260 | """ |
| 261 | def __init__(self, arch=None, value=None): |
| 262 | if value is None: |
| 263 | self._type = RegisterValueType.UndeterminedValue |
| 264 | return |
| 265 | self._type = RegisterValueType(value.state) |
| 266 | if value.state == RegisterValueType.EntryValue: |
| 267 | if arch is None: |
| 268 | self._reg = value.value |
| 269 | else: |
| 270 | self._reg = arch.get_reg_name(value.value) |
| 271 | elif value.state == RegisterValueType.ConstantValue: |
| 272 | self._value = value.value |
| 273 | elif value.state == RegisterValueType.ConstantPointerValue: |
| 274 | self._value = value.value |
| 275 | elif value.state == RegisterValueType.StackFrameOffset: |
| 276 | self._offset = value.value |
| 277 | elif value.state & RegisterValueType.ConstantDataValue == RegisterValueType.ConstantDataValue: |
| 278 | self._value = value.value |
| 279 | self._size = value.size |
| 280 | elif value.state == RegisterValueType.SignedRangeValue: |
| 281 | self._offset = value.value |
| 282 | self._ranges = [] |
| 283 | for i in range(0, value.count): |
| 284 | start = value.ranges[i].start |
| 285 | end = value.ranges[i].end |
| 286 | step = value.ranges[i].step |
| 287 | if start & (1 << 63): |
| 288 | start |= ~((1 << 63) - 1) |
| 289 | if end & (1 << 63): |
| 290 | end |= ~((1 << 63) - 1) |
| 291 | self._ranges.append(ValueRange(start, end, step)) |
| 292 | elif value.state == RegisterValueType.UnsignedRangeValue: |
| 293 | self._offset = value.value |
| 294 | self._ranges = [] |
| 295 | for i in range(0, value.count): |
| 296 | start = value.ranges[i].start |
| 297 | end = value.ranges[i].end |
| 298 | step = value.ranges[i].step |
| 299 | self._ranges.append(ValueRange(start, end, step)) |
| 300 | elif value.state == RegisterValueType.LookupTableValue: |
| 301 | self._table = [] |
| 302 | self._mapping = {} |
| 303 | for i in range(0, value.count): |
| 304 | from_list = [] |
| 305 | for j in range(0, value.table[i].fromCount): |
| 306 | from_list.append(value.table[i].fromValues[j]) |
| 307 | self._mapping[value.table[i].fromValues[j]] = value.table[i].toValue |
| 308 | self._table.append(LookupTableEntry(from_list, value.table[i].toValue)) |
| 309 | elif (value.state == RegisterValueType.InSetOfValues) or (value.state == RegisterValueType.NotInSetOfValues): |
| 310 | self._values = set() |
| 311 | for i in range(0, value.count): |
| 312 | self._values.add(value.valueSet[i]) |
no outgoing calls
no test coverage detected