Я недавно сделал очень незначительную, но очень трудную для поиска ошибку в своем коде, вот MCVE:
#include<iostream>
int foo(){
return false;
}
int main(){
int x = foo();
std::cout << x;
return 0;
}
Как видите, здесь функция foo
return
s false
который, насколько я могу судить, автоматически повышается до int
и сохраняется в x
.
Однако, это была логическая ошибка с моей стороны, и, как ни странно, не была обнаружена ни во время компиляции, ни в CLion. gmm
- мой флаг компиляции. Предполагается, что он улавливает утечки памяти, ошибки времени выполнения (в основном все обычное неопределенное поведение), а также внутренне вызывает gww
, для которого включены наиболее распространенные предупреждения.
Более того, в CLion, CLang-tidy и Clang's Мой собственный инспектор почти всегда ловит все распространенные ошибки в моем коде.
Я много занимаюсь программированием, и эта ошибка недавно произошла вживую на соревнованиях. Я бы предпочел избежать этого. Я приложил свой флаг компиляции ниже. У меня все возможные проверки C / C ++ включены в настройках CLion. Можно ли их отрегулировать, добавить новый параметр или сделать что-нибудь - во время компиляции, или в CLion, или в обоих случаях - чтобы можно было уловить эту проблему во время компиляции?
alias gww='g++ -Wall -Weffc++ -pedantic \
-pedantic-errors -Wextra -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security \
-Wformat-y2k \
-Wimport -Winit-self -Winline \
-Winvalid-pch \
-Wmissing-field-initializers -Wmissing-format-attribute \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-but-set-variable \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings'
alias gmm="gww -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG"