Предупреждение: переполнение при неявном преобразовании константы
в следующей программе строка 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
является одним из них и предупреждает о поведении, которое вас интересует.
в общем случае присвоения 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++ в любом случае.