У меня возникли проблемы с использованием Coverity с моим кодом C / C ++.
Когда я бегу cov-build
с --debug-flags translate-phases
Я получаю вывод, который предполагает, что все вызовы компилятора пропускаются из-за -M
флаг. По сути (чтение build-log.txt
после запуска cov-build
:
ARGS after split: -M -MP <other commands follow>
Тогда следующая строка:
Skipping command line '-M -MP <other commands follow>' because argument '-M' is a skip argument
Похоже, это приводит к тому, что Coverity не компилирует ни один из моих файлов и, следовательно, не производит вывод.
Неужели Coverity просто не поддерживает -M
флаг? Есть ли обходные пути?
Для полноты я использую Coverity Scan 7.6.1 и gcc 4.8.2.
Переходя -M
к компилятору относится -E
запустить только препроцессор. Из-за этого Coverity здесь вообще ничего не делает. Тем не менее, нет никаких причин, почему он не должен продолжать второй вызов gcc
это не включает -M
и, следовательно, сборник.
Тем не менее, есть лучшие способы автоматически генерировать зависимости, чем старые -M
флаг; в частности, более новые версии GCC позволяют выполнять компиляцию и генерацию зависимостей с помощью одной команды. Соответствующая идиома makefile:
# the magic is all in this line
DEPFLAGS = -MMD -MP -MT $@ -MF $(@D)/$(*F).d
# remember to change the spaces to tab here!
# anyway this is just an example. All you need to do is to add
# $(DEPFLAGS) to your usual C compilation rule.
.c.o:
$(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o $@ $<
# same for C++
.cc.o:
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o $@ $<
# at the end of the makefile, include the dependencies
-include $(wildcard *.d)
Вам может понадобиться что-то вроде -include $(wildcard */*.d *.d)
если у вас есть нерекурсивный Makefile. Но эта часть, вероятно, будет очень похожа на ваши существующие правила.
Это описано Вот и связанная веб-страница предоставит больше информации об автоматической генерации зависимостей, чем вы могли предположить.
Я понял ответ около двух часов назад.
Для меня cov-configure
Команда сгенерировала пять различных артефактов конфигурации (где 2-5 — папки):
Я действительно не знаю, почему он решил дать мне четыре папки, две для каждого типа компилятора, но в любом случае.
В каждой из этих четырех папок был coverity_configuration.xml
файл. Все они содержали строки:
<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>
Читая об этом теге, он говорит cov-translate
команда (вызывается из cov-build
) не отправлять cov-emit
любой вызов компилятора, который передает любой из этих аргументов. Удаление этих двух строк решило все.
Я не могу сказать, почему эти два тега были размещены там по умолчанию. Но это работает сейчас.