C ++ включает предупреждение для неинициализированных переменных в классах - PullRequest
3 голосов
/ 05 июня 2019

Позволяет иметь этот код:

#include <iostream>
#include <simd/simd.h>
class X {
public:
    X(int a) : x{a} {} // <-- only x is initialized, y is not

    int x;
    int y;
    simd_double3 d;
};

int main(int argc, const char * argv[]) {
    X x(1);
    X* xx = new X(2);
    std::cout<<x.x<<" "<<x.y<<" "<<x.d.x; // <-- y and x.d are used, but not initialized
    std::cout<<xx->x<<" "<<xx->y<<"END\n";
    return 0;
}

Я хочу выдать предупреждение, что y в X не инициализирован. -Wall, -Wmissing-field-инициализаторы, кажется, ничего не делают. Он компилируется без предупреждений. Этот пример кода производит этот вывод: 1 0 6,95323e-310 Таким образом, даже если y инициализируется в 0 (а это не так, потому что анализ clang помечает его как неинициализированный), ясно, что simd_double3 не инициализируется в 0.

Также анализ лягушки помечает x.y как неинициализированный. ( 1-й аргумент вызова функции является неинициализированным значением )

Кроме того, при создании X в куче в режиме выпуска содержимое x.y является мусором. Вторая строка печатает: 2 -1094795586, y явно не инициализирован.

1 Ответ

1 голос
/ 05 июня 2019

Я проверяю все предупреждения с помощью командной строки clang 8 (последняя версия):
лязг -O2 -стена -Векстра -Всё все
Проверить: https://godbolt.org/z/kKp-N5
У Clang нет предупреждений о неинициализированных переменных в классах и структурах. Но использование clang-tidy с проверкой cppcoreguidelines-pro-type-member-init может оказаться полезным для вас.
https://releases.llvm.org/8.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...