mud compile - предупреждение: приведение от указателя к целому разного размера

Попытка скомпилировать MUD (онлайн-текстовую игру) на Ubuntu 14.04 LTS & gcc 4.4.7, и я продолжаю получать это:

vt100.c: в функции 'get_tactical_map':

vt100.c: 1741: предупреждение: приведение от указателя к целому числу другого размера

vt100.c: 1805: предупреждение: приведение от указателя к целому числу другого размера

Код в каждой из приведенных выше строк одинаков:

*pto++ = 'a' + ((int) fch % 25);

Я могу связать весь файл, если необходимо, но не уверен, куда его загрузить.

2 ответа

Я предполагаю, что вы пытаетесь скомпилировать 32-битный код, написанный кем-то, кто не знает или не заботится о проблемах переносимости языка C в 64-битной системе.

Проблема в том, что преобразование указателя в целое число, которое не может представлять его значение, является неопределенным поведением. См. C11 6.3.2.3 §6:

Любой тип указателя может быть преобразован в целочисленный тип. [...] Если результат не может быть представлен целочисленным типом, поведение не определено.

Переносимый код использовал бы приведение к uintptr_t (или же size_t в эпоху до C99) вместо int,

По-видимому, адрес, удерживаемый указателем, используется в качестве источника случайности для получения произвольной строчной буквы (я думаю, что вряд ли Mints97 верен, и автор просто забыл разыменовать указатель, но без некоторого дополнительного кода, никто могу сказать точно).

Если вы игнорируете предупреждение, в принципе, код может фактически взорваться на архитектурах, которые генерируют сигналы при целочисленном переполнении. Наиболее вероятный случай - возможно безвредная ошибка (в зависимости от того, как используется результат): вместо строчной буквы вы можете получить специальный символ или заглавную букву, если (int)fch бывает отрицательным.

Я не могу сказать больше без объявления переменных, но эта ошибка обычно возникает, когда вы приводите переменную-указатель к типу без указателя (например, void * в int). В вашем коде проблема скорее всего в (int) fch: fch - указатель, и вы пытаетесь преобразовать его в int, Если вы хотите извлечь значение, которое fch указывает на, попробуйте использовать (int) *fchнапример,

*pto++ = 'a' + ((int)*fch % 25);
Другие вопросы по тегам