Простой способ находит неинициализированные членские переменные

Я ищу простой способ найти неинициализированные членские переменные класса.

Нахождение их или в или во время компиляции во время выполнения в порядке.

В настоящее время я имею точку останова в конструкторе класса и исследую членские переменные один за другим.

46
задан FluxLemur 5 June 2017 в 19:26
поделиться

6 ответов

/ Анализ на Visual Studio («Система команды»)

2
ответ дан 26 November 2019 в 20:32
поделиться

Это массив примитивных типов, который сам по себе не является примитивным. Хорошее правило - когда задействовано новое ключевое слово, результат будет в куче.

-121--813909-

Вы могли бы сделать что-то подобное:

<body>

<textarea id="txtArea" onkeypress="onTestChange();"></textarea>

<script>
function onTestChange() {
    var key = window.event.keyCode;

    // If the user has pressed enter
    if (key === 13) {
        document.getElementById("txtArea").value = document.getElementById("txtArea").value + "\n*";
        return false;
    }
    else {
        return true;
    }
}
</script>

</body>

Хотя новая строка символов от нажатия enter все равно будет там, но ее начало к получению того, что вы хотите.

-121--1647258-

-Wuninitialized ?

(Проверяется, используется ли переменная неинициализированной, т.е. если

struct Q { 
  int x, y;
  Q() : x(2) {}
  int get_xy() const { return x*y; }
};

g++ предупреждает только при вызове get _ xy () без назначения y .)

6
ответ дан 26 November 2019 в 20:32
поделиться

Самый большой «Pro» использования UTC заключается в том, что если вы решите пойти с ним, то вы всегда можете быть уверены, что даты хранятся таким образом и никогда не придется сомневаться в себе. Это спасает много хлопот.

-121--3286755-

Вы можете прочитать о ключевом слове без знака в ссылке C++ .

В этом вопросе существуют два различных типа: подписанный и незаписанный. По умолчанию целые числа подписываются, что означает, что они могут иметь отрицательные значения.

В 32-разрядной системе целое число равно 32 Бит, что означает, что оно может содержать значение ~ 4 миллиардов.

И когда он подписан, это означает, что нужно разделить его, оставив от -2 млрд до + 2 млрд.

Когда он не подписан, однако значение не может содержать любые отрицательные числа, так что для целых чисел это будет означать от 0 до + 4 миллиардов.

Есть немного больше информации об этом в Википедии .

-121--815682-

Valgrind может сообщить, находитесь ли вы на linux.

10
ответ дан 26 November 2019 в 20:32
поделиться

Valgrind (FREE, под Linux) и Purify (под Windows) находят неинициализированные переменные, недействительные указатели и т.п., выполняя свой код на специальной виртуальной машине.

Это простой в использовании и чрезвычайно мощный инструмент; он, скорее всего, найдет много ошибок за пределами очевидных неинициализированных переменных.

Coverity, Klocwork и Lint могут найти неинициализированные переменные, используя статический анализ кода.

10
ответ дан 26 November 2019 в 20:32
поделиться

Если вы используете Visual Studio, вы можете компилировать режим отладки, остановить программу в отладчике и искать, какие переменные истециализируются на байты, содержащие 0xCC (стек) или 0xCD (куча) Отказ

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

4
ответ дан 26 November 2019 в 20:32
поделиться

Если вы используете GCC, вы можете использовать флаг -Weffc++, который генерирует предупреждение, когда переменная не инициализирована в списке инициализации членов. Это:

class Foo
{
  int v;
  Foo() {}
};

Приводит к:

$ g++ -c -Weffc++ foo.cpp -o foo.o
foo.cpp: In constructor ‘Foo::Foo()’:
foo.cpp:4: warning: ‘Foo::v’ should be initialized in the member initialization list

Одним из недостатков является то, что -Weffc++ также предупредит вас, когда у переменной есть соответствующий конструктор по умолчанию и инициализация, таким образом, не нужна. Он также предупредит вас, если вы инициализируете переменную в конструкторе, но не в списке инициализации членов. Также он предупреждает о многих других проблемах в стиле C++, таких как отсутствие конструкторов копирования, так что вам, возможно, придется немного почистить свой код, если вы хотите использовать -Weffc++ на регулярной основе.

Есть также ошибка, из-за которой программа всегда выдает предупреждение при использовании анонимных объединений, которую в настоящее время нельзя обойти, кроме как отключить предупреждение, что можно сделать с помощью:

#pragma GCC diagnostic ignored "-Weffc++"

В целом, однако, я нашел -Weffc++ невероятно полезным в отлавливании многих распространенных ошибок C++.

29
ответ дан 26 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: