Преобразования из целочисленного типа в указатель и из указателя в целочисленный тип¶
В данной статье описаны опции настройки предупреждений, относящихся к преобразованиям из целочисленного типа в указатель и из указателя в целочисленный тип. Основной смысл статьи в том, чтобы все опции, относящиеся к данным преобразованиям были перед глазами в общей куче. Это полезно для понимания того, как упростить процесс портирования программ из незащищённого режима в защищённый. В данном случае речь идёт о том, что в защищённом режиме операция преобразования из целочисленного типа в указатель в общем случае является недопустимой, т.к. полученный таким образом указатель нельзя разыменовывать
Неявные преобразования¶
Неявные преобразования из целочисленного типа в указатель и из указателя в целочисленный тип всегда можно считать “плохими”. Единственная опция предупреждения для таких преобразований работает симметрично как в незащищённых режимах, так и в защищённом режиме
-Wint-conversion
Предупреждать о неявных преобразованиях из целочисленного типа в указатель и из указателя в целочисленный тип. По умолчанию опция включена. Работа опции симметрична gcc. Опция работает только в режиме языка C (в режиме языка C++ игнорируется)
Для информации: неявные преобразования разрешены только в языке C. В языке C++ неявные преобразования запрещены. В gcc неявные преобразования в Си++ разрешены по опции
-fpermissive
, но в lcc данная функциональность пока не поддержана
Явные преобразования, затрагивающие enum¶
В случае явных преобразований из enum’а в указатель и из указателя в enum по аналогии с gcc предупреждения не выводятся. Предполагаемая логика gcc состоит в том, что преобразование из enum’а в указатель имеет смысл только в том случае, когда в конечном итоге будет построено обратное преобразование из указателя в enum. В отличие от “обычных” целочисленных типов здесь не предполагается какой-либо арифметики в коде между этими двумя преобразованиями и не предполагается какой-то иной причины появления такого вида преобразований
Явные преобразования в незащищнных режимах¶
Все опции из данного раздела работают только в незащищённых режимах, а в защищённом режиме молча игнорируются
-Wint-to-pointer-cast
Предупреждать о явных преобразованиях из целочисленного типа в указатель с отличающимся размером. По умолчанию опция включена. Работа опции симметрична gcc. Опция работает в режиме языков C и C++
По аналогии с gcc опция не выдаёт предупреждения для преобразований из целочисленной константы в указатель (даже если происходит потеря значащих бит), а так же для
reinterpret_cast
’ов из языка C++
-Wint-to-pointer-cast-same-size
Предупреждать о явных преобразованиях из целочисленного типа в указатель с совпадающим размером. По умолчанию опция выключена. В gcc такой опции нет. Опция работает в режиме языков C и C++
Для симметрии с опцией
-Wint-to-pointer-cast
опция-Wint-to-pointer-cast-same-size
не выдаёт предупреждения для преобразований из целочисленной константы в указатель, а так же для reinterpret_cast’ов из языка C++Сама по себе опция большого смысла не имеет, однако она полезна в тех случаях, когда требуется оценить масштаб бедствия при портировании программ из незащищённых режимов в защищённый: опция позволяет обнаружить преобразования из целочисленного типа в указатель, которые не обнаруживает опция
-Wint-to-pointer-cast
-Wpointer-to-int-cast
Предупреждать о явных преобразованиях из указателя в целочисленный тип с отличающимся размером. По умолчанию опция включена. Работа опции симметрична gcc. Опция работает только в режиме языка C (в режиме языка C++ игнорируется)
Для информации: в языке C++ запрещены явные преобразования из указателя в более короткий целочисленный тип, однако по аналогии с gcc по опции
-fpermissive
такие преобразования разрешены. В этом случае предупреждения будут привязаны к опции-fpermissive
, но не к-Wpointer-to-int-cast
-Wpointer-to-int-cast-same-size
Предупреждать о явных преобразованиях из указателя в целочисленный тип с совпадающим размером. По умолчанию опция выключена. В gcc такой опции нет. Опция работает только в режиме языка C (в режиме языка C++ игнорируется для симметрии с опцией
-Wpointer-to-int-cast
)Сама по себе опция большого смысла не имеет, однако она полезна в тех случаях, когда требуется оценить масштаб бедствия при портировании программ из незащищённых режимов в защищённый: опция позволяет обнаружить преобразования из указателя в целочисленный тип, которые не обнаруживает опция
-Wpointer-to-int-cast
Явные преобразования в защищнном режиме¶
Все опции из данного раздела работают только в защищённом режиме, а в незащищённых
режимах молча игнорируются. Все опции включены в состав опции -Wall-protected
.
Ни одной из этих опций в gcc нет
-Wint32-to-pointer-cast-protected
Предупреждать о явных преобразованиях из целочисленного типа размером 32 бита и меньше в указатель. По умолчанию опция включена. Опция работает в режиме языков C и C++
Для симметрии с опцией
-Wint-to-pointer-cast
опция-Wint32-to-pointer-cast-protected
не выдаёт предупреждения для преобразований из целочисленной константы в указатель, а так же дляreinterpret_cast
’ов из языка C++
-Wint64-to-pointer-cast-protected
Предупреждать о явных преобразованиях из целочисленного типа размером 64 бита в указатель. По умолчанию опция выключена. Опция работает в режиме языков C и C++
Для симметрии с опцией
-Wint-to-pointer-cast
опция-Wint64-to-pointer-cast-protected
не выдаёт предупреждения для преобразований из целочисленной константы в указатель, а так же дляreinterpret_cast
’ов из языка C++
-Wint128-to-pointer-cast-protected
Предупреждать о явных преобразованиях из целочисленного типа размером 128 бит в указатель. По умолчанию опция выключена. Опция работает в режиме языков C и C++
Для симметрии с опцией
-Wint-to-pointer-cast
опция-Wint128-to-pointer-cast-protected
не выдаёт предупреждения для преобразований из целочисленной константы в указатель, а так же дляreinterpret_cast
’ов из языка C++
-Wpointer-to-int32-cast-protected
Предупреждать о явных преобразованиях из указателя в целочисленный тип размером 32 бита и меньше. По умолчанию опция включена. Опция работает только в режиме языка C (в режиме языка C++ игнорируется для симметрии с опцией
-Wpointer-to-int-cast
)Для информации: в языке C++ запрещены явные преобразования из указателя в более короткий целочисленный тип, однако по аналогии с gcc по опции
-fpermissive
такие преобразования разрешены. В этом случае предупреждения будут привязаны к опции-fpermissive
, но не к-Wpointer-to-int32-cast-protected
-Wpointer-to-int64-cast-protected
Предупреждать о явных преобразованиях из указателя в целочисленный тип размером 64 бита. По умолчанию опция выключена. Опция работает в режиме языков C и C++
Для информации: в языке C++ запрещены явные преобразования из указателя в более короткий целочисленный тип. Тем не менее, в защищённом режиме явные преобразования из указателя в целочисленный тип размером 64 бита разрешены. Это обусловлено тем, что тип
intptr_t
в защищённом режиме является 64-битным
-Wpointer-to-int128-cast-protected
Предупреждать о явных преобразованиях из указателя в целочисленный тип размером 128 бит. По умолчанию опция выключена. Опция работает в режиме языков C и C++