News
Another flaw in assignment "Metamorphic Testing"
Written on 10.07.2023 09:30 by Dominic Steinhöfel
Dear seminar participants,
Stanimir discovered another problem in the current assignment. In the function "test_tiny_c_interpreter_with_wrong_dict," the "wrong_dict" was initialized only once. However, every call to "interpret_tiny_c" changes the dictionary, resulting in the interpreter being called with a potentially different dictionary every time. A correct implementation of the function looks like this:
def test_tiny_c_interpreter_with_wrong_dict(): """ This function tests the Tiny-C interpreter with the metamorphic oracle provided by `get_transformation_pair`. It completes normally in the case of success and raises an `AssertionError` otherwise. This version of `test_tiny_c_interpreter_with_wrong_dict` passes a non-trivial initial dictionary to the interpreter to test the error-finding capabilities of the metamorphic tester. :return: Nothing. """ wrong_dict = tuple({var: 1 for var in string.ascii_lowercase}.items()) for _ in range(20): generator = generate_transformation_pair( DEAD_CODE_INSERTION_GRAMMAR_2, TINY_C_GRAMMAR, constraint ) for pair in itertools.islice(generator, 5): left = str(pair.filter(lambda node: node.value == "<left>")[0][1]) right = str(pair.filter(lambda node: node.value == "<right>")[0][1]) result_left = interpret_tiny_c(left, dict(wrong_dict), gas=20) result_right = interpret_tiny_c(right, dict(wrong_dict), gas=20) assert result_left == result_right
Mutable data structures are a constant source of trouble in programming. For this reason, I mostly work with immutable types in my research prototypes. Unfortunately, I was not that disciplined when implementing the current assignment.
This could be a nice lesson to be learned. However, you were affected by this problem and might have lost time when trying to work around it. For this, I am very sorry. We will consider this context when grading this part of the assignment.
All the best,
Dominic