2013-02-18 2 views
2

Я использую coverty (5.5.1) (среди прочих), чтобы упростить мой код. Я наткнулся на проблему, и теперь у меня есть сомнения в том, что моя установка покрытия не завершена. Посмотрите на этот пример:Покрытие и C++: куча (с новым) против размещения на стеке

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. В вопросе this я узнал, что было бы «приятно иметь» такое предупреждение, выданное компилятором или любым другим инструментом.

Вопреки моему первоначальному пониманию проблемы теперь я узнал, что на самом деле Coverity излучает дефект, который соответствует отлично (UNINT), но только тогда, когда выделяется в стеке, а не при его создании с new. Поэтому в моей функции main я получаю предупреждение за A a2(5), но не для A *a1 = new A(5).

Мне кажется, что покрытие обрабатывает вызов конструктора при использовании new, чем при создании объекта в стеке.

Есть ли что-либо, что я забыл в моей конфигурации покрытия? Что я могу сделать, чтобы иметь предупреждение при распределении в куче?

ответ

0

Оказалось, что согласно поддержке это известная ошибка в Coverity (даже в текущей версии). Исправление может появиться с версией, выпущенной следующим летом.

Ошибка указана в ID: 50128 UNINIT FN: член, используемый в конструкторе до инициализации, и как таковой будет помещен в примечания к выпуску при фиксированном и выпущенном.

Смежные вопросы