gcc — C ++ init-list: использование неинициализированных членов для инициализации других не выдает предупреждения

Ни g ++ (4.4 и 4.6), ни clang ++ (3.2), ни coverity с -Wall и -Wextra (+ некоторые другие) или -Weverything соответственно не дают мне предупреждения для следующего фрагмента кода:

class B {
char *t2;
char *t;

public:
B() : t2(t), t(new char[100]) {}
};

Я бы, по крайней мере, ожидал небольшое предупреждение об использовании неинициализированных (member-) переменных.

Я что-то упускаю? Это разыскиваемый сценарий «без предупреждения». У меня есть (сейчас была) по крайней мере одна ошибка в моем программном обеспечении, которую было трудно найти.

РЕДАКТИРОВАТЬ: Как можно прочитать в этот новый вопрос Я понял, что Coverity предупреждает об этой проблеме в некоторых случаях.

9

Решение

Нет веской причины не выдавать предупреждение здесь.

G ++ не достаточно умен, чтобы диагностировать неинициализированные члены в конструкторах, смотрите http://gcc.gnu.org/PR2972

У меня есть исправление, которое я надеюсь завершить «когда-нибудь в этом году».

Даже с моим патчем я не уверен, что G ++ предупредит, потому что t2 является инициализируется, но инициализируется неопределенным значением. Чтобы компилятор отслеживал, это не тривиально, но должно быть возможно (поэтому я удивлен, даже Coverity пропускает его). Такие инструменты времени выполнения, как valgrind поймите это правильно, хотя.

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

6

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

Стандарт C ++ говорит, что использование неинициализированных переменных приводит к неопределенному поведению. Он не требует, чтобы компилятор выдавал диагностическую информацию об этом. Таким образом, получать предупреждение или нет — это QOI (Качество реализации).

3