Включить предупреждение компилятора для инициации переменных-членов самими собой - PullRequest
1 голос
/ 08 декабря 2011

Есть ли предупреждение компилятора под gcc и / или vs для обнаружения переменных-членов, инициированных для себя?

gcc имеет -Winit-self, но, похоже, работает только для

int f()
{
    int i = i;
    return i;
}

и не для

class A {
    int m; 
public:
    A(int) : m(m) { } 
    int f() {return m;} 
};

Редактировать : Возвратите вопрос, все, чего не хватало, было -O1 или выше (Спасибо @honk)

Редактировать2 : На самом деле проблема снова на столе.В упрощенном примере -O1 -Wuninitialized -Winit-self работает, однако, он ловит его не в точке, где вы объявляете m(m), а когда вы определяете A(4).Это также означает, что компилятор не уловит его, если конструктор находится в своем собственном модуле компиляции (что, я думаю, должно быть довольно часто в сценариях реального мира).

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Кажется, что нет никаких флагов компилятора ни в msvc, ни в gcc. Тем не менее, с gcc, valgrind обнаруживает любое использование непосвященных переменных, что решает проблему. Не уверен в решении для Windows. Анализ кода Visual Studio выглядит так, как будто он может его забрать, но в базовых версиях его нет.

0 голосов
/ 08 декабря 2011

Когда вы делаете это в функции:

int i = i;

, тогда я думаю, вы можете использовать опцию -Wuninitialized с GCC, так как это с использованием неинициализированной переменной i для инициализацииi.То же самое с переменной-членом в вашем коде.

Также обратите внимание, что этот код вызывает неопределенное поведение.Однако, если вы сделаете это для переменных на уровне пространства имен, это будет четко определено.

...