Преобразования из целочисленного типа в указатель и из указателя в целочисленный тип¶
В данной статье описаны опции настройки предупреждений, относящихся к преобразованиям из целочисленного типа в указатель и из указателя в целочисленный тип. Основной смысл статьи в том, чтобы все опции, относящиеся к данным преобразованиям были перед глазами в общей куче. Это полезно для понимания того, как упростить процесс портирования программ из незащищённого режима в защищённый. В данном случае речь идёт о том, что в защищённом режиме операция преобразования из целочисленного типа в указатель в общем случае является недопустимой, т.к. полученный таким образом указатель нельзя разыменовывать
Неявные преобразования¶
Неявные преобразования из целочисленного типа в указатель и из указателя в целочисленный тип всегда можно считать “плохими”. Единственная опция предупреждения для таких преобразований работает симметрично как в незащищённых режимах, так и в защищённом режиме
-Wint-conversionПредупреждать о неявных преобразованиях из целочисленного типа в указатель и из указателя в целочисленный тип. По умолчанию опция включена. Работа опции симметрична gcc. Опция работает только в режиме языка C (в режиме языка C++ игнорируется)
Для информации: неявные преобразования разрешены только в языке C. В языке C++ неявные преобразования запрещены. В gcc неявные преобразования в Си++ разрешены по опции
-fpermissive, но в lcc данная функциональность пока не поддержана
Явные преобразования в незащищнных режимах¶
Все опции из данного раздела работают только в незащищённых режимах, а в защищённом режиме молча игнорируются
-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++
