Доступ к int как неподписанному длинному неопределенному поведению? - PullRequest
1 голос
/ 02 апреля 2020

В книге под названием «Программирование» Windows, в одном из примеров у нас есть эта строка:

ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;

i здесь было ранее объявлен как int, но 4-й аргумент ReadFile равен LPDWORD, что является typedef для DWORD*, а DWORD является typedef для unsigned long. Это эффективно печатает. В большинстве систем unsigned long и int имеют одинаковый размер, но я думаю, что доступ к переменной, как если бы это был какой-то другой тип, является неопределенным поведением. Это нормально? Это нормально, только если размеры одинаковы? Это UB? Я проверил несколько ошибочных веб-сайтов, и они, кажется, не перечисляют это. Я что-то пропустил?

1 Ответ

4 голосов
/ 02 апреля 2020

Если DWORD определено так, как вы описываете, то код содержит нарушение ограничения, которое должен диагностировать компилятор, и стандарт больше не охватывает поведение любого сгенерированного исполняемого файла. Не существует неявного преобразования из int * в unsigned long *, независимо от размеров типов.

Если вы не видите сообщение об ошибке компилятора, я настоятельно рекомендую настроить параметры компилятора таким образом, чтобы отображалось сообщение об ошибке. Некоторые компиляторы по умолчанию показывают сообщение с предупреждением для этой ошибки, которое может ввести неосторожных в заблуждение, что реальной проблемы нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...