Source Code Variants

When source code is preprocessed differently, variants arise. These variants and their coverage are reported separately. For convenience, a merged version can be generated.

Preprocessor directives like #if or #ifdef create variants, if source code is active in one compilation and inactive in another one. Macro code from #define statements can also lead to variants recognized by Testwell CTC++.

Example: Source file with conditionally inactivated functions

basic_functions.c contains two functions, special_linux and special_win, each of them only active when compiled for the respective operating system. By default, variants are reported separately, with numbers (1), (2), … and so on. Each variant has its own coverage counters.

Merging of variants

For testing in safety-critical development projects, variants typically have to be tested independently. For convenience, it is useful for several reasons to merge coverage results of variants:
  • see full coverage for functions not affected by preprocessing differences,
  • get a combined impression about coverage for affected functions,
  • avoid multiplied impact of one source file with variants on the total figures.

With two options of ctcreport, you can merge variants: -merge-variants, leading to one representation for every source file, and -merge-and-keep-variants, showing both the variants and the merged result.

If a function is identical in all file variants it is present, all coverage data is simply combined. For example, counters are added up.

If a function has preprocessing differences itself, ctcreport calculates merged figures for all coverage measures. The purpose is a good enough impression when preprocessing differences are small - if the nature of a function is completely changed, the results become useless.

In the merged representation of a function, lines are marked if they contain code both active and inactive in variants. Instrumentation probes are marked if they are different in variants.

Example: Source code view of two variants and their merged representation

In function do_stuff, the macro MAGIC_CONSTANT leads to two different probes for line 22. The associated counters are all present and not added up. The three statements in if-branch are considered equal, hence they are counted as executed in the merged result.

Function do_more_stuff contains conditionally compiled code. A code line being active and executed in at least one variant is considered active and executed in the merged result.