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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top