long
в short
и им подобные. То есть, распознавать, скорее всего, умеет, а вот сообщать о них — нет. Вот простой пример:
int main (int argc, char **argv)
{
unsigned long a = 0xFFFFFFFE;
unsigned char b = a + 1;
return 0;
}
Я, честно говоря, был немало удивлен. Специально этим вопросом не занимался, но был уверен, что такие ситуации GCC отслеживать умеет. Ан нет... Что самое интересное, большинство моих знакомых гуру тоже были в этом уверены. В нашем проекте, как и во многих других, известных мне проектах, используется GCC 4.1.2, некоторые используют 4.2. Вроде бы есть опция
-Wconversion
, но работает она только для fixed и floating point. В общем, подстава.Думаю, что о важности такого предупреждения говорить не нужно. В MSVC++ эта ситуация легко отслеживается включением третьего уровня предупреждений —
/W3
. После портирования нашего проекта на MSVC++, мы смогли легко локализовать и исправить несколько ошибок, связанных как раз с некорректным преобразованием типов.Но самое интересное не в этом. После длительного изучения документации по GCC, все-таки нашел :)
Итак, не прошло и 25 лет, как разработчики GCC все таки прониклись пользой отслеживания размерности типов. Начиная с версии 4.3 (первый релиз вышел в марте 2008 года, то есть, всего полгода назад) GCC умеет распознавать и сообщать о ситуациях с присваиманием из long в char и им подобных.
Опция
-Wconversion
, которая работала только для fixed и floating point теперь разделена на две опции -Wtraditional-conversion
и -Wconversion
. Подробности можно почитать здесь http://gcc.gnu.org/wiki/NewWconversionЯ проверил — на приведенный пример ругается "warning: conversion to ‘short unsigned int’ from ‘long unsigned int’ may alter its value". Аллелуйа!
Ура, товарищи! Даешь новые версии! Даешь новые баги! :)