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

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

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


person John Zwinck    schedule 21.11.2008    source источник


Ответы (2)


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

..

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

person Reed Hedges    schedule 21.11.2008
comment
Ага, значит, 4.2.4 слишком устарела, чтобы предупреждать как следует, а 4.3.2 работает (здесь я делаю пару предположений, но думаю, можно с уверенностью сказать, потому что я использую Ubuntu и Я видел некоторые заметки по этой проблеме, которые дают основания думать, что это просто что-то исправлено в 4.3+. - person John Zwinck; 22.11.2008
comment
Теперь я попробовал GCC 4.3.2 на машине Ubuntu Intrepid, и -Wconversion делает то, что я хочу. Ура. Но бу для 4.2.4 не работает. - person John Zwinck; 22.11.2008
comment
отсутствует упоминание -Wsign-conversion для g++ (необходимо, по крайней мере, в более новых версиях)... - person codeling; 23.10.2012

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

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
person Robert Gamble    schedule 21.11.2008
comment
Как показывает принятый ответ, компилятор вполне способен обнаруживать такие вещи. - person qwr; 30.06.2019