Nós já publicamos uma vez sobre flags para GCC/Clang que fala sobre as flags fundamentais para construção de software que são:
g -Wpedantic -Wall -Werror -Wextra -fsanitize=address
No entanto, apesar delas já ajudarem bastante, você ainda pode melhorar seu código com Analisadores Estáticos e também flags para verificar conversões e entre outros posíveis bugs.
Um compilador ideal para isso é o clang++, pois exibe mais warnings que o g++.
Que são elas:
-g -O0 # Debug info + sem otimizações (mais legível)
-fno-omit-frame-pointer # Melhor para stack traces e debuggers
-Wconversion # Converte implícitos perigosos (int → float, etc)
-Wsign-conversion # Converte entre signed/unsigned
-Wnull-dereference # Detecta uso de ponteiros nulos
-Wdouble-promotion # Detecta promoções implícitas para double
-Wformat=2 # Verifica printf/scanf com mais rigor
-Wcast-align # Avisa casts com possível problema de alinhamento
Além de:
-fsanitize=undefined # UB: overflows, null deref, shift inválido, etc
-fsanitize=leak # Detecta memory leaks
Além também da -Wshadow
e da -Wfloat-conversion
.
Obs: Use -O1
se quiser um pouco de otimização sem perder muito a clareza no debug.
Eu as utilizei em conjunto para debug a Terlang e após compilar com essas flags obtive diversos Warnings
que foram transformados em erros, abaixo a imagem no momento da compilação:
Eu use o arquivo debug.ter e resolvi todos esses erros/Warnings de acordo com esse commit, mas nesse commit também há outras modificação e implementações adicionais.
Em resumo em criei um arqivo debug.ter
com todas flags, ex.:
/*
TER/TERLANG
By: Marcos Oliveira
*/
// Defs
auto compiler = "clang++ -stdlib=libc++ -O0 -fno-omit-frame-pointer -Wfloat-conversion"
auto add_flags = "-Wsign-conversion -Wnull-dereference -Wdouble-promotion -Wformat=2 -Wcast-align -Wconversion"
auto sanitize = " -fsanitize=address -fsanitize=undefined -fsanitize=leak"
auto flags = "-g -Wall -Werror -Wextra -Wshadow -Wpedantic"
auto build = compiler + " " + add_flags + " " + sanitize + " " + " " + flags + " ./src/*.cpp"
// Display full command
output(build)
exec(build)
Então, quando estiver em modo desenvolvimento recomendo compilar com todas essa flags, no entanto, quando for para release o ideal é retirar todas, pois elas comprometem o desempenho e aumentam significamente o tamanho do binário.
cpp cppdaily linguagemc gcc clang compiladores