Ejemplo n.º 1
0
    def test_serialize_state_with_closed_files(self) -> None:
        # regression test: issue 954

        platform = self.linux
        filename = platform.current.push_bytes("/bin/true\x00")
        fd = platform.sys_open(filename, os.O_RDONLY, 0o600)
        platform.sys_close(fd)
        pickle_dumps(platform)
Ejemplo n.º 2
0
    def testContextSerialization(self):
        import pickle as pickle

        initial_file = ""
        new_file = ""
        new_new_file = ""
        constraints = ConstraintSet()
        initial_state = State(constraints, FakePlatform())
        initial_state.context["step"] = 10
        initial_file = pickle_dumps(initial_state)
        with initial_state as new_state:
            self.assertEqual(initial_state.context["step"], 10)
            self.assertEqual(new_state.context["step"], 10)

            new_state.context["step"] = 20

            self.assertEqual(initial_state.context["step"], 10)
            self.assertEqual(new_state.context["step"], 20)
            new_file = pickle_dumps(new_state)

            with new_state as new_new_state:
                self.assertEqual(initial_state.context["step"], 10)
                self.assertEqual(new_state.context["step"], 20)
                self.assertEqual(new_new_state.context["step"], 20)

                new_new_state.context["step"] += 10

                self.assertEqual(initial_state.context["step"], 10)
                self.assertEqual(new_state.context["step"], 20)
                self.assertEqual(new_new_state.context["step"], 30)

                new_new_file = pickle_dumps(new_new_state)

                self.assertEqual(initial_state.context["step"], 10)
                self.assertEqual(new_state.context["step"], 20)
                self.assertEqual(new_new_state.context["step"], 30)

            self.assertEqual(initial_state.context["step"], 10)
            self.assertEqual(new_state.context["step"], 20)

        self.assertEqual(initial_state.context["step"], 10)

        del initial_state
        del new_state
        del new_new_state

        initial_state = pickle.loads(initial_file)
        self.assertEqual(initial_state.context["step"], 10)
        new_state = pickle.loads(new_file)
        self.assertEqual(new_state.context["step"], 20)
        new_new_state = pickle.loads(new_new_file)
        self.assertEqual(new_new_state.context["step"], 30)
Ejemplo n.º 3
0
    def testBasicPickle(self):
        import pickle

        cs = ConstraintSet()

        # make array of 32->8 bits
        array = cs.new_array(32)
        # make free 32bit bitvector
        key = cs.new_bitvec(32)

        # assert that the array is 'A' at key position
        array = array.store(key, ord("A"))
        # let's restrict key to be greater than 1000
        cs.add(key.ugt(1000))
        cs = pickle.loads(pickle_dumps(cs))
        self.assertTrue(self.solver.check(cs))
Ejemplo n.º 4
0
 def check(ty: Type, pickle_size=None, sizeof=None, **kwargs):
     x = ty(**kwargs)
     """
     print(
         type(x),
         "\n  Pickle size:",
         len(pickle_dumps(x)),
         "\n  GetSizeOf:",
         sys.getsizeof(x),
         "\n  Slotted:",
         not hasattr(x, "__dict__"),
     )
     """
     self.assertEqual(len(pickle_dumps(x)), pickle_size)
     if sys.version_info[1] == 6:  # Python 3.6
         self.assertEqual(sys.getsizeof(x), sizeof)
     elif sys.version_info[1] == 7:  # Python 3.7
         self.assertEqual(sys.getsizeof(x), sizeof + 8)
     elif sys.version_info[1] >= 8:  # Python 3.8+
         self.assertEqual(sys.getsizeof(x), sizeof - 8)
     self.assertFalse(hasattr(x, "__dict__"))  # slots!
     self.assertTrue(hasattr(x, "_taint"))  # taint!
     checked.add(ty)
Ejemplo n.º 5
0
    def test_ConstraintsForking(self):
        solver = self.solver
        import pickle

        cs = ConstraintSet()
        # make free 32bit bitvectors
        x = cs.new_bitvec(8)
        y = cs.new_bitvec(8)

        # linear relation
        # cs.add(x+y*5 == 0)

        # Fork and divide in quadrants

        saved_up = None
        saved_up_right = None
        saved_up_left = None
        saved_down = None
        saved_down_right = None
        saved_down_left = None

        with cs as cs_up:
            cs_up.add(y.uge(0x80))
            self.assertItemsEqual(solver.get_all_values(cs_up, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y), range(0x80, 0x100))

            saved_up = pickle_dumps((x, y, cs_up))

            self.assertItemsEqual(solver.get_all_values(cs_up, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y), range(0x80, 0x100))

            with cs_up as cs_up_right:
                cs_up_right.add(x.uge(0x80))
                saved_up_right = pickle_dumps((x, y, cs_up_right))
                self.assertItemsEqual(solver.get_all_values(cs_up_right, x), range(0x80, 0x100))
                self.assertItemsEqual(solver.get_all_values(cs_up_right, y), range(0x80, 0x100))

            self.assertItemsEqual(solver.get_all_values(cs_up, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y), range(0x80, 0x100))

            with cs_up as cs_up_left:
                cs_up_left.add(x.ult(0x80))
                saved_up_left = pickle_dumps((x, y, cs_up_left))
                self.assertItemsEqual(solver.get_all_values(cs_up_left, x), range(0, 0x80))
                self.assertItemsEqual(solver.get_all_values(cs_up_left, y), range(0x80, 0x100))

            self.assertItemsEqual(solver.get_all_values(cs_up, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y), range(0x80, 0x100))

        with cs as cs_down:
            cs_down.add(y.ult(0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y), range(0, 0x80))

            saved_down = pickle_dumps((x, y, cs_down))

            self.assertItemsEqual(solver.get_all_values(cs_down, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y), range(0, 0x80))

            with cs_down as cs_down_right:
                cs_down_right.add(x.uge(0x80))
                saved_down_right = pickle_dumps((x, y, cs_down_right))
                self.assertItemsEqual(solver.get_all_values(cs_down_right, x), range(0x80, 0x100))
                self.assertItemsEqual(solver.get_all_values(cs_down_right, y), range(0, 0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y), range(0, 0x80))

            with cs_down as cs_down_left:
                cs_down_left.add(x.ult(0x80))
                saved_down_left = pickle_dumps((x, y, cs_down_left))
                self.assertItemsEqual(solver.get_all_values(cs_down_left, x), range(0, 0x80))
                self.assertItemsEqual(solver.get_all_values(cs_down_left, y), range(0, 0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y), range(0, 0x80))

            x, y, cs_up = pickle.loads(saved_up)
            self.assertItemsEqual(solver.get_all_values(cs_up, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y), range(0x80, 0x100))

            x, y, cs_up_right = pickle.loads(saved_up_right)
            self.assertItemsEqual(solver.get_all_values(cs_up_right, x), range(0x80, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up_right, y), range(0x80, 0x100))

            x, y, cs_up_left = pickle.loads(saved_up_left)
            self.assertItemsEqual(solver.get_all_values(cs_up_left, x), range(0x00, 0x80))
            self.assertItemsEqual(solver.get_all_values(cs_up_left, y), range(0x80, 0x100))

            x, y, cs_down = pickle.loads(saved_down)
            self.assertItemsEqual(solver.get_all_values(cs_down, x), range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y), range(0x0, 0x80))

            x, y, cs_down_right = pickle.loads(saved_down_right)
            self.assertItemsEqual(solver.get_all_values(cs_down_right, x), range(0x80, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down_right, y), range(0x00, 0x80))

            x, y, cs_down_left = pickle.loads(saved_down_left)
            self.assertItemsEqual(solver.get_all_values(cs_down_left, x), range(0x00, 0x80))
            self.assertItemsEqual(solver.get_all_values(cs_down_left, y), range(0x00, 0x80))