я использую Coverity (5.5.1) (среди прочего), чтобы укрепить мой код. Я наткнулся на проблему, и теперь у меня есть сомнения, что моя установка покрытия не завершена. Посмотрите на этот пример:
class A
{
int _a,_b;
public:
A(int b) : _a(_b), _b(b)
{ }
};
int main(void)
{
A *a1 = new A(5);
delete a1;
A a2(5);
return 0;
}
Как видно я пользуюсь _b
инициализировать _a
прежде чем он будет инициализирован с b
, В этот На вопрос я узнал, что было бы «хорошо» иметь такое предупреждение, выдаваемое компилятором или любым другим инструментом.
Вопреки моему первоначальному пониманию проблемы, которую я теперь выяснил, эта скрытая оболочка фактически испускает дефект, который идеально подходит (UNINT), но только при размещении в стеке, а не при создании с new
, Так по моему main
Я получаю предупреждение за A a2(5)
но не для A *a1 = new A(5)
,
Мне кажется, что Coverity обрабатывает вызов конструктора по-разному при использовании new
чем когда объект создан в стеке.
Есть ли что-то, что я упустил в своей конфигурации прикрытия? Что я могу сделать, чтобы получить предупреждение при размещении в куче?
Оказалось, что по поддержке это известная ошибка в Coverity (даже в текущей версии). Исправление может появиться в версии, выпущенной следующим летом.
Ошибка указана под ID: 50128 UNINIT FN: член, используемый в конструкторе до инициализации и как таковой будет помещен в примечания к выпуску после исправления и выпуска.
Других решений пока нет …