Проблемы со сборкой Chocolate Doom в Fedora Linux выявили конфликт между кастомным типом
Изначальное исправление заключалось в изменении препроцессора для использования встроенного типа
Анализ ассемблерного кода показал, что для
В результате было установлено, что использование значения
boolean
и ключевыми словами false
и true
в новом стандарте C23. Изначально, код использовал собственный enum
для boolean
в C, а в C++ применял стандартный bool
. Переход на C23 сделал bool
, true
и false
ключевыми словами, вызвав ошибку компиляции из-за совпадения с именами в кастомном enum
. Изображение носит иллюстративный характер
Изначальное исправление заключалось в изменении препроцессора для использования встроенного типа
bool
в C23. Однако, последующий анализ показал, что кастомный тип, основанный на int
, обрабатывался корректно, поскольку заполнялся memset
со значением -1
, и сравнение с false
(0
) давало правильный результат. Использование стандартного _Bool
типа, размером 1 байт, после такой же инициализации приводило к некорректному поведению из-за сравнения 255 с 0. Анализ ассемблерного кода показал, что для
_Bool
сравнение с false
выполнялось как «не равно 1", а с true
как «не равно 0". Поэтому при значении 255 условия == true
и == false
выполнялись одновременно, так как 255 не равно ни 0, ни 1. В результате было установлено, что использование значения
255
для _Bool
вызывает неопределенное поведение, согласно стандарту C99, поскольку такое значение не является валидным для типа _Bool
, и в дальнейшем значение _Bool
интерпретируется как 1
. В итоге, проект был объявлен написанным на C99, что гарантировало наличие stdbool.h
и использование типов данных из него.