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

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

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

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

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