Могу ли я заставить GCC предупреждать о передаче слишком широких типов в функции?

StackOverflow https://stackoverflow.com/questions/310108

Вопрос

Ниже приведен явно дефектный код, для которого, я думаю, компилятор должен выдать диагностику.Но ни gcc ни g++ делает, даже со всеми вариантами предупреждений, которые я мог придумать: -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;
}

Есть ли способ сделать gcc и g++ предупредить об этом?Кстати, есть ли у вас другой компилятор, который предупреждает об этом по умолчанию или в довольно распространенной конфигурации дополнительных предупреждений?

Примечание:Я использую GCC (компиляторы C и C++) версии 4.2.4.

Редактировать:Я только что нашел это gcc -Wconversion делает свое дело, но тот же вариант g++ нет, и я действительно использую здесь C++, поэтому мне нужно решение для g++ (и теперь мне интересно, почему -Wconversion вроде не то).

Редактировать: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 предполагает, что это может быть исправлено в g++ 4.4...может быть?Мне пока неясно, та же ли это проблема и/или действительно ли исправление появится в этой версии.Может быть, кто-нибудь с версией 4.3 или 4.4 сможет попробовать мой тестовый пример.

Это было полезно?

Решение

Используйте -Wconversion - проблема заключается в неявном приведении (преобразовании) из длинного x в короткое, когда вызывается функция f(short x) [не printf], и -Wconversion скажет что-то вроде "приведение из длинного в короткое может изменить значение ".

..

Редактировать:только что увидел твою заметку.-Wconversion выдает мне предупреждение при использовании g++ 4.3.2 в Linux...(4.3.2-1 в Debian)

Другие советы

Я настоятельно рекомендую инвестировать в PC-lint / FlexeLint из Gimpel . Программное обеспечение создано для того, чтобы ловить такие вещи, как это не делает компилятор. Это относительно недорого и стоит своих денег. На сайте есть демо-версия, которую вы можете использовать для оценки, вот что она сообщает для рассматриваемой строки из вашего примера:

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top