Traces between requirements and code are proven to save effort and improve quality of software products. Such traces are essential for code understanding and change management. However, capturing and maintaining traceability remains highly unreliable. Traceability is rarely captured immediately while requirements and code co-evolve.
Instead they are usually recovered later. At that time, key people may have moved or their recollection of facts may be incomplete or inconsistent.
In this thesis we present two complementary approaches for trace capture and maintenance in the presence of incompleteness and inconsistency.
In the first approach we propose a novel technique for capturing traceability that allows software engineers to express arbitrary assumption about the traceability between requirements and code -- even assumptions that may be inconsistent or incomplete. Our approach takes these assumptions to reasons about the logical consequences (hence increasing completeness) and to reveal inconsistencies, if any (hence increasing correctness).
In the second approach, we propose a novel technique for validating and predicting requirements-to-code traces through calling relationships within the code. As input, the approach requires an executable system, the corresponding requirements, and some initial requirements-to-code traces. As output, the approach validates the input by identifying likely incorrect traces using trace distribution patterns in calling relationships.