Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
ss = []
total_ptrs = len(ptrs)
while len(ptrs) > 0:
ptr = ptrs.pop()
if total_ptrs > 1:
s_ = s.fork()
else:
s_ = s
count = 0
null = bv.Constant(ptr.size, 0)
bytes = []
not_terminated = None
not_already_terminated = bl.Constant(True)
while s_.solver.check(num > count):
byte = s_.read(ptr + bv.Constant(ptr.size, count), 8)
not_terminated = not_already_terminated & (byte == value)
bytes.append((not_already_terminated, byte, count))
if not_terminated.symbolic:
not_already_terminated = bl.Symbol(unique_name('tmp'))
s_.solver.add(not_already_terminated == not_terminated)
else:
not_already_terminated = not_terminated
count += 1
bytes.reverse()
str1 = f.params[0]
str2 = f.params[1]
s.log.function_call(f, 'strcmp(str1={}, str2={})', str1, str2)
iter1 = iter(String(s, str1))
iter2 = iter(String(s, str2))
first_smaller = bv.Constant(32, -1)
first_larger = bv.Constant(32, 1)
zero = bv.Constant(32, 0)
characters = []
not_terminated = None
not_already_terminated = bl.Constant(True)
while True:
(char1, constraint1) = next(iter1)
(char2, constraint2) = next(iter2)
not_terminated = not_already_terminated & constraint1
not_terminated = not_terminated & constraint2
not_terminated = not_terminated & (char1 == char2)
characters.append((not_already_terminated, char1, char2))
not_already_terminated = not_terminated
if ((not char1.symbolic and char1.value == 0)
or (not char2.symbolic and char2.value == 0)):
break
def __iter__(self):
terminated = False
index = 0
constraint = bl.Constant(True)
while not terminated:
read_address = self.address + bv.Constant(self.address.size, index)
byte = self.state.read(read_address, 8)
if self.state.solver.check(byte.can_be_nonzero()):
if byte.symbolic:
if not constraint.symbolic:
constraint = (byte != 0)
else:
# not sure that I've implemented &= in smt
constraint = constraint & (byte != 0)
# this might look silly, but it actually makes the
# output smt formulae substantially smaller...
returned_constraint = bl.Symbol(unique_name('string_length'))
ptr1 = f.params[0]
ptr2 = f.params[1]
num = f.params[2]
s.log.function_call(f, 'memcmp(ptr1={}, ptr2={}, num={})', ptr1, ptr2, num)
count = 0
first_smaller = bv.Constant(ptr1.size, -1)
first_larger = bv.Constant(ptr1.size, 1)
zero = bv.Constant(ptr1.size, 0)
bytes = []
not_terminated = None
not_already_terminated = bl.Constant(True)
while s.solver.check(num > count):
byte1 = s.read(ptr1 + bv.Constant(ptr1.size, count), 8)
byte2 = s.read(ptr2 + bv.Constant(ptr2.size, count), 8)
not_terminated = not_already_terminated & (byte1 == byte2)
bytes.append((not_already_terminated, byte1, byte2))
if not_terminated.symbolic:
not_already_terminated = bl.Symbol(unique_name('tmp'))
s.solver.add(not_already_terminated == not_terminated)
else:
not_already_terminated = not_terminated
count += 1