Определите неинициализированную переменную в переполнении VStack

У меня есть этот кусок кода,

#include <iostream>

void foo(int *a)
{
std::cout<<*a<<std::endl;
}

int main()
{
int i;
foo(&i);
}

что очевидно, что используется неинициализированная переменная.

я пытался / RTCu а также полагался на ошибка C4700, но для приведенного выше кода компилятор не помечает это как ошибку.

Я также попытался запустить анализ кода, но он сообщил, что фрагмент кода не имеет проблем.

Итак, каков надежный способ определения неинициализированных переменных в нашем исходном коде?

я знаю valgrind делает замечательную работу здесь, но это не вариант для меня, так как у меня много обращений к Windows API и MFC.

5

Решение

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

1

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

Что касается части статического анализа: Начиная с VS2013, я бы не стал полагаться на то, что анализаторы по умолчанию слишком много ловят, если у вас есть доступ к другому инструменту статического анализа (хотя полезно использовать VS, чтобы поймать то, что могут пропустить другие). Хотя здесь, скорее всего, это не так, обратите внимание, что статические анализаторы могут игнорировать шаблоны, которые они видят во многих местах или которые были переопределены другими разработчиками как приемлемая норма. Я был бы удивлен, если Coverity не сообщил об этом случае (извините, не установлен банкомат для тестирования). Если он проигнорировал это, объяснение могло бы быть, что это считали возможным адресом совместно используемой памяти.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector