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])
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)
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)
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)
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)
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])
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])
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])