Modified Condition/Decision Coverage in the GNU Compiler Collection
Jørgen Kvalsvik
TL;DR
The paper presents a language-agnostic approach to Modified Condition/Decision Coverage (MC/DC) in GCC 14 by treating Boolean expressions as Binary Decision Diagrams (BDDs) embedded in the control-flow graph. It introduces an offline masking-table computation on reduced, ordered BDDs and uses a bitset-based runtime to record independently contributing conditions, enabling efficient instrumentation across languages. The implementation demonstrates MC/DC support for C, C++, D, and Rust, highlighting the CFG-based, language-agnostic pipeline and its scalability through fixed-size bitsets. Limitations include a 64-bit cap on the number of basic conditions and reliance on front-end CFGs that reflect BDD structure, with future work aiming to relax bitset size and support additional MC/DC forms.
Abstract
We describe the implementation of the masking Modified Condition/Decision Coverage (MC/DC) support in GCC 14, a powerful structural coverage metric with wide industry adoption for safety critical applications. By analyzing the structure of Boolean expressions with Binary Decision Diagrams we can observe the key property of MC/DC, the power to independently affect the outcome, and map to the edges of the Control Flow Graph. This mapping can be translated to a few bitwise instructions and enables GCC to instrument programs to efficiently observe and record when conditions have been taken and have an independent effect on the outcome of a decision. By analyzing the BDD rather than the program syntax, GCC can measure MC/DC for almost all of its languages with a single language-agnostic implementation, including support for C, C++, D, and Rust.
