Ssylka

Загадки C23 и Boolean в Chocolate Doom

Проблемы со сборкой Chocolate Doom в Fedora Linux выявили конфликт между кастомным типом boolean и ключевыми словами false и true в новом стандарте C23. Изначально, код использовал собственный enum для boolean в C, а в C++ применял стандартный bool. Переход на C23 сделал bool, true и false ключевыми словами, вызвав ошибку компиляции из-за совпадения с именами в кастомном enum.
Загадки C23 и Boolean в Chocolate Doom
Изображение носит иллюстративный характер

Изначальное исправление заключалось в изменении препроцессора для использования встроенного типа 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 и использование типов данных из него.


Новое на сайте

18884Знаете ли вы, что приматы появились до вымирания динозавров, и готовы ли проверить свои... 18883Четыреста колец в туманности эмбрион раскрыли тридцатилетнюю тайну звездной эволюции 18882Телескоп Джеймс Уэбб раскрыл тайны сверхэффективной звездной фабрики стрелец B2 18881Математический анализ истинного количества сквозных отверстий в человеческом теле 18880Почему даже элитные суперраспознаватели проваливают тесты на выявление дипфейков без... 18879Шесть легендарных древних городов и столиц империй, местоположение которых до сих пор... 18878Обзор самых необычных медицинских диагнозов и клинических случаев 2025 года 18877Критическая уязвимость CVE-2025-14847 в MongoDB открывает удаленный доступ к памяти... 18876Научное обоснование классификации солнца как желтого карлика класса G2V 18875Как безграничная преданность горным гориллам привела Дайан Фосси к жестокой гибели? 18874Новый родственник спинозавра из Таиланда меняет представления об эволюции хищников Азии 18873Как новая электрохимическая технология позволяет удвоить добычу водорода и снизить... 18872Могут ли ледяные гиганты Уран и Нептун на самом деле оказаться каменными? 18871Внедрение вредоносного кода в расширение Trust Wallet привело к хищению 7 миллионов... 18870Проверка клинического мышления на основе редких медицинских случаев 2025 года