Преобразования из целочисленного типа в указатель и из указателя в целочисленный тип

В данной статье описаны опции настройки предупреждений, относящихся к преобразованиям из целочисленного типа в указатель и из указателя в целочисленный тип. Основной смысл статьи в том, чтобы все опции, относящиеся к данным преобразованиям были перед глазами в общей куче. Это полезно для понимания того, как упростить процесс портирования программ из незащищённого режима в защищённый. В данном случае речь идёт о том, что в защищённом режиме операция преобразования из целочисленного типа в указатель в общем случае является недопустимой, т.к. полученный таким образом указатель нельзя разыменовывать

Неявные преобразования

Неявные преобразования из целочисленного типа в указатель и из указателя в целочисленный тип всегда можно считать “плохими”. Единственная опция предупреждения для таких преобразований работает симметрично как в незащищённых режимах, так и в защищённом режиме

-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++