Fil-C делает setjmp/longjmp и ucontext безопасными для памяти

Fil-C, диалект C с безопасной памятью, теперь поддерживает setjmp/longjmp и API ucontext (setcontext, getcontext, makecontext, swapcontext) без повреждения стека или нарушений способностей. Эта возможность появилась в версии 0.680 и доступна при сборке из исходных кодов.
Проблема контекстных API
Эти API печально известны своей небезопасностью, поскольку неправильное использование может восстановить висящий стек. Распространенные ошибки включают:
- Вызов
setjmpилиgetcontextв функции с последующим выходом — сохраненный контекст указывает на кадр стека, который больше не существует. - Завершение потока, а затем попытка восстановить выполнение на освобожденном стеке.
- Создание контекста с
makecontextна стеке, освобождение этого стека, а затемswapcontextилиsetcontextна него. - Передача текущего исполняемого контекста в качестве второго аргумента
swapcontext(переключение на самого себя).
В стандартном C («Yolo-C») такие ошибки вызывают неявное повреждение стека, трудноотлаживаемые сбои и потенциальные уязвимости безопасности. В Fil-C все подобные случаи приводят к панике в момент неправильного использования.
Как Fil-C обеспечивает безопасность памяти
Подход Fil-C различается для setjmp/longjmp и ucontext. Для setjmp/longjmp ключевая проблема заключается в том, что setjmp возвращается дважды — при вызове и после longjmp. Сохранение контекста требует от компилятора правильной работы с изменчивыми (volatile) переменными, но Fil-C гарантирует, что восстановление контекста никогда не обращается к освобожденной или недопустимой памяти.
Для ucontext Fil-C управляет стеками так, что операция либо допустима, либо вызывает панику, поскольку висящие кадры стека просто невозможны.
Пример: setjmp/longjmp в Fil-C
Следующая программа демонстрирует поведение:
#include <setjmp.h>
#include <stdio.h>
int main(int argc, char** argv) {
volatile int x = 42;
jmp_buf jb;
if (setjmp(jb)) {
printf("x = %d\n", x);
return 0;
}
x = 666;
longjmp(jb, 1);
printf("Should not get here.\n");
return 1;
}
Эта программа выводит x = 666 и завершается. Без volatile компилятор может оптимизировать и вывести 42. Fil-C не меняет семантику оптимизации, но предотвращает повреждение памяти в любом случае.
Для кого это?
Для разработчиков, использующих ucontext-подобные корутины (например, Boost fibers) или setjmp/longjmp для обработки исключений в C-программах, желающих обезопасить память.
📖 Читать полный источник: HN AI Agents
👀 Смотрите также

Атаки с маскировкой домена обходят детекторы в многолетних LLM-системах
Новое исследование показывает, что инъекционные полезные нагрузки, адаптированные под словарь предметной области, обходят детекцию: IDR упал с 93.8% до 9.7%. Многоагентные дебаты усиливают атаки. Llama Guard 3 не обнаруживает ни одной полезной нагрузки.

Студент вносит два патча безопасности в производственную систему OpenClaw.
Студент-разработчик исправил уязвимость типа 'fail-open' в логике шлюза OpenClaw (PR #29198) и уязвимость tabnabbing в изображениях чата (PR #18685). Оба исправления были включены в производственные релизы v2026.3.1 и v2026.2.24 соответственно.

Изоляция локальных ИИ-агентов с помощью микро-ВМ Firecracker
Разработчик создал песочницу, которая изолирует выполнение ИИ-агентов внутри микро-ВМ Firecracker, работающих на Alpine Linux, решая проблемы безопасности, связанные с выполнением команд агентами напрямую на хост-машине. Конфигурация использует vsock для связи и подключается к Claude Desktop через MCP.

Уязвимость удаленного выполнения кода в приложении Windows Notepad CVE-2026-20841
CVE-2026-20841 — это уязвимость удаленного выполнения кода в приложении Блокнот Windows. Подробности и рекомендации по смягчению уязвимости доступны в руководстве обновления Центра реагирования на безопасность Microsoft.