Posso fazer GCC avisar sobre passando tipos de largura demais para funções?
-
08-07-2019 - |
Pergunta
A seguir é algum código obviamente defeituoso para que eu acho que o compilador deve emitir um diagnóstico. Mas nem gcc
nem g++
faz, mesmo com todas as opções de avisos que eu poderia pensar: -pedantic -Wall -Wextra
#include <stdio.h>
short f(short x)
{
return x;
}
int main()
{
long x = 0x10000007; /* bigger than short */
printf("%d\n", f(x)); /* hoping for a warning here */
return 0;
}
Existe uma maneira de fazer gcc
e g++
alertar sobre isso? Em uma nota lateral, você tem outro compilador que avisa sobre isso por padrão ou em uma configuração extra-avisos bastante comum?
Nota:. Estou usando GCC (ambos C e compiladores C ++) versão 4.2.4
Edit: Eu só descobri que gcc -Wconversion
faz o truque, mas a mesma opção de g++
não, e eu realmente estou usando C ++ aqui, então eu preciso de uma solução para g++
(e agora estou perguntando por que -Wconversion
não parecem ser isso).
Edit: http://gcc.gnu.org/bugzilla/show_bug. cgi? id = 34389 sugere que este pode ser fixado na g++ 4.4
... talvez? Não está claro para mim ainda se é o mesmo problema e / ou se a correção é realmente chegando nessa versão. Talvez alguém com 4.3 ou 4.4 pode tentar o meu caso de teste.
Solução
Use -Wconversion - o problema é uma conversão implícita (conversão) de comprimento x para curto quando a função f (x short) é chamado [não printf], e -Wconversion vai dizer algo como "elenco de longo para curto pode alterar o valor".
..
Edit: acabei de ver a sua nota. -Wconversion resulta em um aviso para mim, usando g ++ 4.3.2 em Linux ... (4.3.2-1 no Debian)
Outras dicas
Gostaria de sugerir investir em PC-lint / FlexeLint de Gimpel . O software é feito para a captura de coisas como esta que o compilador simplesmente não é. É relativamente barato e vale a pena o preço. Há uma demonstração on-line no site que você pode usar para avaliá-lo, aqui é o que relata para a linha em questão do seu exemplo:
diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)