Сканирование Coverity пропускает все команды из-за опции gcc -M и ничего не сканирует

У меня возникли проблемы с использованием 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.

1

Решение

Переходя -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. Но эта часть, вероятно, будет очень похожа на ваши существующие правила.

Это описано Вот и связанная веб-страница предоставит больше информации об автоматической генерации зависимостей, чем вы могли предположить.

1

Другие решения

Я понял ответ около двух часов назад.

Для меня cov-configure Команда сгенерировала пять различных артефактов конфигурации (где 2-5 — папки):

  1. Основной файл конфигурации
  2. г ++ — конфиг-0
  3. G ++ — конфигурации-1
  4. НКУ-конфиг-0
  5. GCC-конфигурации-1

Я действительно не знаю, почему он решил дать мне четыре папки, две для каждого типа компилятора, но в любом случае.

В каждой из этих четырех папок был coverity_configuration.xml файл. Все они содержали строки:

<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>

Читая об этом теге, он говорит cov-translate команда (вызывается из cov-build) не отправлять cov-emit любой вызов компилятора, который передает любой из этих аргументов. Удаление этих двух строк решило все.

Я не могу сказать, почему эти два тега были размещены там по умолчанию. Но это работает сейчас.

0