2024-11-18
Си без указателей
2024-11-18 12:00Филипп Пизло (Filip Pizlo) представил на конференции SPLASH'24 открытый C/C++ компилятор Fil-C, предоставляющий защиту от проблем, вызванных ошибками при работе с памятью. Проект нацелен на обеспечение полной совместимости с существующим кодом на языках C и C++ - для обеспечения безопасной работы с памятью достаточно просто пересобрать существующий код. Компилятор построен с использованием компонентов от проекта LLVM и распространяется под лицензией Apache 2.0. Runtime поставляется под лицензией BSD. В отличие от недавно анонсированного проекта TrapC, находящегося на стадии проектирования, компилятор Fil-C уже доведён до готовности сборки существующего кода.
Проектом также поставляются безопасно работающие с памятью варианты стандартных библиотек C (libc) и C++ (libc++), основанные на библиотеках Musl и LLVM libc++. Среди прочего, в собираемых программах могут использоваться такие возможности, как многопоточность, обработка сигналов, маппинг файлов в память (mmap), longjmp/setjmp и обработка исключений в C++. При помощи Fil-C без внесения изменений могут быть собраны проекты bzip2, zip, pcre и ncurses. С незначительными модификациями поддерживается сборка OpenSSH, OpenSSL, CPython, SQLite, Lua, Curl, Lynx, jpeg6b, zsh, xzutils и simdutf.
Защита от проблем с памятью обеспечивается благодаря применению 128-разрядных указателей MonoCaps с метаданными для проверки типов и отслеживания границ буферов, а также задействованию сборщика мусора FUGC, контролирующего все операции по выделению и освобождению памяти. В случае ошибок при работе с памятью приложение сразу аварийно завершается, что не позволяет эксплуатировать возможные уязвимости.
Заявлено, что комбинация из MonoCaps и FUGC позволяет отлавливать и блокировать все ошибки, связанные с выходом за границы буфера в стеке и куче, обращением к уже освобождённой памяти, состояниями гонки при работе с указателями, а также неправильной обработкой типов (Type Confusion) в контексте пересечения типов указателей и не указателей, проблем при динамической компоновке (linking) и некорректного использования va_lists. Кроме того, Fil-C отдельно проверяет границы и типы в буферах, передаваемых в системные вызовы.
Ценой возможности использования Fil-C для защиты существующих проектов, без необходимости переписывания их кода или задействования особых языковых конструкций, является снижение производительности. На текущем этапе развития, собираемые в Fil-C программы медленнее примерно в 1.5-5 раз, по сравнению со сборкой обычными компиляторами. В планах заявлена работа по проведению оптимизации. Предполагается, что после завершения этой работы в большинстве случаев код будет выполняться медленнее в 1.2 раза, а в наихудших сценариях замедление не превысит полтора раза. Компилятор пока поддерживает только платформу Linux на системах X86_64. Предыдущие версии поддерживали macOS и FreeBSD, но затем было решено не распылять усилия и вначале подготовить качественный порт libc для одной платформы.
(отсюда)
"The Fil-C Memory Safety Manifesto: FUGC Yeah!"
Проект на гитхабе: github.com/pizlonator/llvm-project-deluge