Могу ли я предупредить GCC о передаче слишком широких типов в функции? - PullRequest
11 голосов
/ 21 ноября 2008

Ниже приведен некоторый явно неисправный код, для которого, как мне кажется, компилятор должен выдавать диагностическое сообщение. Но ни 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 добивается цели, но та же опция, что и для 1014 *, не подходит, и я действительно использую C ++, поэтому мне нужно решение для g++ ( интересно, почему -Wconversion не похоже на это).

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

Ответы [ 2 ]

8 голосов
/ 21 ноября 2008

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

..

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

1 голос
/ 21 ноября 2008

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

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
...