Не могли бы вы представить модульные тесты соответствующих функций, которые существуют исключительно для того, чтобы отключить gcov путем прямой атаки на теоретически неустранимые пути кода?Поскольку они являются модульными тестами, они, возможно, могут игнорировать «невозможность» ситуаций.Они могут вызывать функции, которые никогда не вызываются, передавать недопустимые значения enum для перехвата веток по умолчанию и т. Д.
Затем либо запустить эти тесты только для версии вашего кода, скомпилированной с помощью NDEBUG, либо запустить их в жгуте проводов.который проверяет, что запускается assert - независимо от того, что поддерживает ваша тестовая среда.
Я нахожу это немного странным, хотя в спецификации говорится, что код должен быть там, а не в спецификации, содержащей функциональные требования к коду.,В частности, это означает, что ваши тесты не тестируют эти требования, что является хорошей причиной для поддержания функциональности требований.Лично я хотел бы изменить спецификацию, говоря: «если вызывается с недопустимым значением перечисления, функция должна завершиться ошибкой assert
. Вызывающие не должны вызывать функцию с недопустимым значением перечисления в режиме освобождения».Или что-то подобное.
Предположительно, в настоящее время говорится, что "все операторы switch должны иметь регистр по умолчанию".Но это означает, что стандарты кодирования мешают наблюдаемому поведению (по крайней мере, наблюдаемому при gcov), вводя мертвый код.Стандарты кодирования не должны этого делать, поэтому функциональная спецификация должна учитывать стандарты кодирования, если это возможно.
Если это не удастся, вы можете обернуть нечитаемый код в #if !GCOV_BUILD
и сделать отдельную сборку для gcov's.выгода.Эта сборка будет не соответствовать некоторым требованиям, но при условии правильности анализа кода она дает уверенность в том, что вы хотите, чтобы тестовый набор проверял все остальное.
Редактировать: вы говорите, что используете хитрый кодгенератор, но вы также просите решение путем аннотирования исходного кода.Если вы меняете исходный код, можете ли вы просто удалить мертвый код во многих случаях?Не то, чтобы изменение сгенерированного источника было бы идеальным, но необходимо ...