Мога ли да накарам 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++ не и аз наистина използвам C++ тук, така че имам нужда от решение за 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-преобразуване за 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