Предупреждение: переполнение при неявном преобразовании константы

в следующей программе строка 5 дает предупреждения о переполнении как и ожидалось, но удивительно, что строка 4 не дает никакого предупреждения в GCC:http://www.ideone.com/U0BXn

int main()
{
    int i = 256;
    char c1 = i;    //line 4
    char c2 = 256;  //line 5
    return 0;
}

Я думал, что обе строки должны дать переполнения предупреждение. Или я что-то упускаю?


тема, которая привела меня к этому эксперименту, такова:проверка типа typedef?

там я сказал следующее (которое я удалил из своего ответа, потому что когда я запускаю его, он не появляется, как я ожидал):

//However, you'll get warning for this case:

typedef int  T1;
typedef char T2;

T1 x = 256;     
T2 y = x; //possible overflow warning! (but it doesn't give warning :()

4 ответов


-Wall не включает в себя много вариантов. -Wconversion является одним из них и предупреждает о поведении, которое вас интересует.

см.http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html


в общем случае присвоения int значение char объект, компилятор не знает, является ли int находится вне диапазона char.

посмотрите на фактическое предупреждение более внимательно:

warning: overflow in implicit constant conversion

именно в этом конкретном случае константа преобразуется в char что компилятор может предупредить вас. Аналогично, если вы изменили объявление i на const:

const int i = 256;

вы также получите предупреждение, потому что значение присваивается c2 является постоянным выражением.

обратите внимание также, что предупреждение несколько вводит в заблуждение, поскольку преобразование технически не "переполняется"."Арифметическое переполнение дает неопределенное поведение в C++. Сужающееся преобразование (например,int to char, Если int имеет больший диапазон, чем char) дает некоторое преобразование, определенное реализацией.


ну, строка 5-это очевидная ошибка, которую любой компилятор может видеть напрямую, и всегда ошибка. Строка 4 потребует по крайней мере некоторые анализ потока данных для обнаружения ошибки. Возможно, это не сделано с настройками, используемыми на сайте, или, возможно, авторы компилятора не считали это достаточно важным, чтобы понять это.


сообщение GCC 4.3, семантика -Wconversion были обновлены для обнаружения неявных преобразований, которые могут изменить значение, но вы должны включить -Wsign-conversion также, потому что в противном случае вы не получите предупреждение для кода, который может изменить знак числа из-за принуждения между подписанными и неподписанными типами.

вопреки тому, что говорит сумасшедший Эдди, до GCC 4.3 (который еще не был выпущен в то время) -Wconversion Не проверял в общем случае проблемы, введенные неявным преобразование типов и тому подобное. Скорее, он проверял, будет ли ваша программа вести себя иначе, чем если бы она использовала прототипы функций K&R старого стиля.

это не только означало, что он не давал предупреждения обо всех неявных проблемах преобразования / принуждения типа, но также означало, что какой-то хороший код давал ненужное предупреждение. И, конечно, вы не получите никакой ошибки с g++ потому что такие прототипы не являются допустимыми C++ в любом случае.