Могу ли я заставить GCC предупреждать о передаче слишком широких типов в функции?
-
08-07-2019 - |
Вопрос
Ниже приведен явно дефектный код, для которого, я думаю, компилятор должен выдать диагностику.Но ни 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)