Рассмотрим следующий код:Почему int a; а = станд :: макс (а, х) не выделяет «неинициализированные» предупреждения
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> v{{1, 2, 3}};
int a;
std::cout << a << std::endl; // 1
for (const int x : v) {
a = std::max(a, x); // 2
}
std::cout << a << std::endl;
return 0;
}
По мере роста современных компиляторов и теперь внимательно следить над глупыми программиста ошибок, они отслеживают униализованные переменные. Однако этот код на C++ смущает их. До сих пор я получаю следующие результаты:
(1) (2)
g++ 5.3.1
clang++ 3.7 ✔
Solaris Studio 12.5 ✔
Как вы можете видеть, лязг и solstudio может обнаружить только случай (1) и игнорирующие случай (2), в то время как г ++ игнорирует оба. Есть ли осложнение для его обнаружения в случае (2)? Почему g ++ так плохо?
Опция компилятора я использовал:
$ g++-5 -std=c++11 -Wall -Wpedantic -pedantic -Wextra \
-Wuninitialized -Wmaybe-uninitialized aisa.cpp
$ clang++ -std=c++11 -Wall -Wpedantic -pedantic -Wextra -Wuninitialized aisa.cpp
$ CC -std=c++11 -xprevise aisa.cpp
Рассмотрите возможность подачи запроса функции как на gcc, так и на clang-трекеры - такие тривиальные ситуации, как этот, вероятно, можно обнаружить с помощью дополнительной логики –
Что произойдет, если вы удалите первый пример? Разве clang или Solaris Studio предупреждают об унифицированной переменной? –
Вы также можете получить более эффективные предупреждения, если вы поднимете уровень оптимизации. –