Exemplo n.º 1
0
    def test_deadlock2(self):
        file_to_parse = "deadlock2.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_deadlock(mascm))
        self.assertEqual(3, len(result), "Unexpected number of results.")
        self.assertEqual(2, len(result[0]), "Unexpected edges in the result.")
        self.assertEqual(2, len(result[1]), "Unexpected edges in the result.")
        self.assertEqual(2, len(result[2]), "Unexpected edges in the result.")

        # First pair
        self.assertEqual(DeadlockType.exclusion_lock, result[0][0],
                         "Incorrect deadlock type")
        self.assertEqual(mascm.edges[10], result[0][1][0][0])
        self.assertEqual(mascm.edges[12], result[0][1][0][1])
        self.assertEqual(mascm.edges[32], result[0][1][1][0])
        self.assertEqual(mascm.edges[34], result[0][1][1][1])

        # Second pair
        self.assertEqual(DeadlockType.exclusion_lock, result[1][0],
                         "Incorrect deadlock type")
        self.assertEqual(mascm.edges[10], result[1][1][0][0])
        self.assertEqual(mascm.edges[14], result[1][1][0][1])
        self.assertEqual(mascm.edges[30], result[1][1][1][0])
        self.assertEqual(mascm.edges[34], result[1][1][1][1])

        # Third pair
        self.assertEqual(DeadlockType.exclusion_lock, result[2][0],
                         "Incorrect deadlock type")
        self.assertEqual(mascm.edges[12], result[2][1][0][0])
        self.assertEqual(mascm.edges[14], result[2][1][0][1])
        self.assertEqual(mascm.edges[30], result[2][1][1][0])
        self.assertEqual(mascm.edges[32], result[2][1][1][1])
Exemplo n.º 2
0
 def test_no_recursion_deadlock1(self):
     file_to_parse = "no_recursion_deadlock1.c"
     file_path = join(self.source_path_prefix, file_to_parse)
     with purify(file_path) as pure_file_path:
         ast = parse_file(pure_file_path)
         mascm = create_mascm(deque([ast]))
     result = list(detect_deadlock(mascm))
     self.assertEqual([], result)
Exemplo n.º 3
0
 def test_no_race_condition6(self):
     file_to_parse = "no_race_condition6.c"
     file_path = join(self.source_path_prefix, file_to_parse)
     with purify(file_path) as pure_file_path:
         ast = parse_file(pure_file_path)
         mascm = create_mascm(deque([ast]))
     result = list(detect_race_condition(mascm))
     self.assertListEqual([], result)
Exemplo n.º 4
0
def main() -> None:
    """ Main function
    """
    args = parser.parse_args()
    logging.basicConfig(filename=join(dirname(__file__),
                                      "mascm_generator.log"),
                        level=args.log_level)
    mascm = create_mascm(create_ast(args.path, args.cflags))
    print(mascm)
Exemplo n.º 5
0
 def test_race_condition7(self):
     file_to_parse = "race_condition7.c"
     file_path = join(self.source_path_prefix, file_to_parse)
     with purify(file_path) as pure_file_path:
         ast = parse_file(pure_file_path)
         mascm = create_mascm(deque([ast]))
     result = list(detect_race_condition(mascm))
     self.assertEqual(1, len(result), "Unexpected edges in the result.")
     self.assertEqual(mascm.edges[26], result[0])
    def test_no_atomicity_violation1(self):
        file_to_parse = "no_atomicity_violation1.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        c.relations["symmetric"].append(('++', 'printf'))
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_atomicity_violation(mascm))

        self.assertEqual(0, len(result))
        self.assertListEqual([], result)
Exemplo n.º 7
0
 def test_deadlock3(self):
     file_to_parse = "deadlock3.c"
     file_path = join(self.source_path_prefix, file_to_parse)
     with purify(file_path) as pure_file_path:
         ast = parse_file(pure_file_path)
         mascm = create_mascm(deque([ast]))
     result = list(detect_deadlock(mascm))
     self.assertEqual(1, len(result), "Unexpected number of results.")
     self.assertEqual(DeadlockType.missing_unlock, result[0][0],
                      "Incorrect deadlock type")
     self.assertEqual(mascm.edges[12], result[0][1][0][0])
Exemplo n.º 8
0
    def test_order_violation1(self):
        file_to_parse = "order_violation1.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        c.relations["backward"].append(('malloc', '++'))
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_order_violation(mascm))

        self.assertEqual(1, len(result))
        self.assertEqual(mascm.operations[13], result[0][0])
        self.assertEqual(mascm.operations[25], result[0][1])
        self.assertEqual(mascm.resources[0], result[0][2])
    def test_atomicity_violation3(self):
        file_to_parse = "atomicity_violation3.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        c.relations["symmetric"].append(('++', 'printf'))
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_atomicity_violation(mascm))

        self.assertEqual(1, len(result))
        # First thread
        self.assertEqual(mascm.edges[18], result[0][0][0])
        self.assertEqual(mascm.edges[36], result[0][0][1])
        self.assertEqual(mascm.edges[51], result[0][0][2])
Exemplo n.º 10
0
    def test_recursion_deadlock1(self):
        file_to_parse = "recursion_deadlock1.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_deadlock(mascm))
        self.assertEqual(2, len(result), "Unexpected number of results.")

        self.assertEqual(DeadlockType.incorrect_lock_type, result[0][0],
                         "Incorrect deadlock type")
        self.assertEqual(mascm.edges[19], result[0][1][0][0])
        self.assertEqual(mascm.edges[10], result[0][1][0][1])

        self.assertEqual(DeadlockType.incorrect_lock_type, result[1][0],
                         "Incorrect deadlock type")
        self.assertEqual(mascm.edges[22], result[1][1][0][0])
        self.assertEqual(mascm.edges[10], result[1][1][0][1])
    def test_atomicity_violation5_with_forward_relation(self):
        file_to_parse = "atomicity_violation5.c"
        file_path = join(self.source_path_prefix, file_to_parse)
        c.relations["forward"].append(('++', 'printf'))
        c.relations["forward"].append(('--', 'printf'))
        with purify(file_path) as pure_file_path:
            ast = parse_file(pure_file_path)
            mascm = create_mascm(deque([ast]))
        result = list(detect_atomicity_violation(mascm))

        self.assertEqual(2, len(result))
        # First thread
        self.assertEqual(mascm.edges[20], result[0][0][0])
        self.assertEqual(mascm.edges[31], result[0][0][1])
        self.assertEqual(mascm.edges[37], result[0][0][2])

        self.assertEqual(mascm.edges[22], result[1][0][0])
        self.assertEqual(mascm.edges[33], result[1][0][1])
        self.assertEqual(mascm.edges[39], result[1][0][2])