TrapC: безопасный «наследник» C и C++. Что за язык?
Стартап Trasec разрабатывает новый язык программирования, который называется TrapC. Авторы проекта провозглашают его «наследником» C и C++. ЯП обещает устранить главные проблемы «предков», включая небезопасное управление памятью. Для этого в TrapC внедрены автоматические проверки и защита программ от типичных ошибок. Это делает невозможным выход за границы буфера или обращение к несуществующей памяти и значительно усложняет жизнь хакерам. Давайте оценим новинку.
В чем проблема C и C++
C и C++ — популярные языки программирования, «пионеры» отрасли, одна из основ современной ИТ-индустрии. Но у них есть проблемы. Они предоставляют разработчикам прямой доступ к управлению памятью, что, с одной стороны, обеспечивает высокую производительность и гибкость. С другой — эта же фича делает программы уязвимыми к ошибкам, связанным с памятью. Вот основные проблемы, ставшие поводом для критики:
переполнение буфера: классическая уязвимость, которую хакеры используют для выполнения вредоносного кода;
ошибки с указателями: некорректное использование ведет к обращению к несуществующей или освобожденной памяти;
утечки памяти: из-за ошибок в коде разработчики часто не высвобождают память, что приводит к росту потребления ресурсов;
сложность отладки: низкоуровневый доступ к памяти делает диагностику и исправление ошибок чрезвычайно трудоемкими.
Все это может привести к непредсказуемому поведению программ и создать лазейки для хакерских атак. Из-за этих проблем многие компании и отдельные разработчики начали искать альтернативы. Rust — один из главных претендентов, но переход на него связан с большими затратами времени и ресурсов.
TrapC появляется в качестве «философского камня», решающего все проблемы. Он предлагает концепцию «минимальной боли» благодаря своей совместимости с кодом упомянутых языков программирования.
TrapC разрабатывается стартапом Trasec, основанным Робином Роу и Габриэль Пантерой. Робин Роу — бывший профессор компьютерных наук, участвовавший в комитетах по развитию стандартов C и C++. Он также известен как соавтор графического редактора Cinepaint, использовавшегося при создании графики для ряда голливудских фильмов. Габриэль Пантера ранее занимала руководящую должность в компании Disney.
Они собрали команду из специалистов по языкам программирования и безопасности, чтобы создать новый хороший инструмент для разработчиков, отвечающий требованиям современного рынка.
TrapC: основные достоинства
У диалекта немало плюсов по сравнению с «обычными» языками программирования. Посмотрим, о чем нам рассказывают авторы проекта.
Революция в управлении памятью
Одно из центральных нововведений TrapC — переработанный подход к управлению указателями. Система обработчиков исключений (trap) следит за их безопасностью и предотвращает:
выход за границы буфера;
обращение к освобожденной памяти;
попытки некорректного преобразования типов.
Механизм интегрирован на уровне компилятора, что исключает необходимость в ручном управлении этими аспектами и существенно снижает вероятность ошибок. Вот пример кода. Заявлено, что TrapC не даст переполнить буфер buff при выполнении «strcpy (buff, argv[1]);» или не даст увеличить указатель или индекс массива на значение, смещающее его за пределы выделенного буфера или конца массива:
// darpa_tractor.c
int main(int argc,char* argv[])
{
char buff[8]; // TrapC implicitly zeros, no dirty memory
int success = 0;// In C, buffer overwrite corrupts success
strcpy(buff,argv[1]); // TrapC cannot overrun, strcpy safe
if(!strcmp(buff,"s3cr8tpw"))
{
success = 1;
}
if(success) // TrapC blocked strcpy overwrite, success good
{
printf("Welcome!\n");
}
return !success;
}
// trapc_ptr.c
int main()
{
const char* ptr = "Hello World"; // 12 char wide
while(ptr) // No buffer overrun with TrapC
{
printf("%c",*ptr); // print one char at a time
ptr++; // Steps off the end: TrapC nulls ptr!
} // Do NOT attempt this in C, will segfault!
assert(ptr == 0);
return 0;
}
// trapc_array.c
int score[10];
printf("%i",score[-1]); // TrapC will not allow access
for(int i = 0;i <= INT_MAX;i++) // C Undefined Behavior
{
printf("%i",i);
}
// In C, above code is an infinite loop, will not stop.
// TrapC blocks i++ overflow wrap-around, stops.
// TrapC will fail-safe, call error handler if defined.
Еще одна полезная фича — автоматическое управление памятью. В отличие от C и C++, где программист отвечает за выделение и освобождение памяти через вызовы malloc, free, new или delete, TrapC берет эту задачу на себя. Новый компилятор:
автоматически отслеживает, где память больше не используется;
высвобождает ее, предотвращая утечки;
анализирует код на этапе компиляции, чтобы указать на потенциальные проблемы.
Такой подход чем-то похож на принципы работы «сборщиков мусора», используемых в языках Java и Python. Но он сохраняет высокую производительность благодаря оптимизации работы компилятора.
Упрощение синтаксиса
TrapC устраняет избыточные ключевые слова и структуры. Например:
удалено слово
union
, которое в C и C++ использовалось для определения объединений, но часто приводило к ошибкам;исключены сложные конструкции для ручного управления памятью;
отсутствуют макросы: упрощение синтаксиса и устранение ошибок, связанных с их использованием;
простое преобразование типов: меньше ошибок, связанных с некорректным приведением типов.
«У TrapC меньше ключевых слов, чем у C, потому что я убрал union
и другие вещи. В первую очередь те, что я редко использую, и которые, как правило, вызывают проблемы. Да и в системах, критически важных для безопасности, вы их вряд ли будете использовать», — заявил Роу. По его словам, это делает TrapC более доступным для начинающих программистов, снижая порог вхождения, при этом опытные разработчики ценят гибкость и совместимость с привычными инструментами.
Безопасность без потери производительности
Многие опасаются, что добавление дополнительных проверок и автоматического управления памятью снизит производительность кода. Но разработчики TrapC уверяют, что их компилятор минимизирует накладные расходы, выполняя большинство проверок во время компиляции, а не работы программы. Это позволяет TrapC сохранять конкурентоспособность по скорости с C и C++, оставаясь более безопасным.
Будущее TrapC
Стартап Trasec планирует открыть исходный код компилятора TrapC в 2025 году — это станет важным шагом в плане популяризации языка. Open-source-код даст возможность сообществу разработчиков:
вносить улучшения в компилятор;
адаптировать язык под специфические задачи;
создавать собственные инструменты и библиотеки для работы с TrapC.
Открытость также повысит доверие к проекту, позволяя экспертам убедиться в его надежности и эффективности. Это может стать мощным стимулом для массового перехода на TrapC, особенно среди организаций, ищущих баланс между безопасностью, производительностью и совместимостью с существующими системами.
TrapC уже вызывает интерес у компаний, работающих с критически важным ПО, где каждая ошибка может стоить миллионов. Основные отрасли, где может пригодиться этот диалект:
ПО для авиации и медицины;
создание банковских и финансовых систем;
разработка ядра операционных систем.
Кстати, можно сравнить возможности новинки с Rust. Последний считается одной из самых популярных альтернатив C и C++, но TrapC предлагает иной подход. Если Rust полностью пересматривает концепцию работы с памятью, делая язык сложным для освоения, TrapC старается сохранить простоту и привычность C, убрав при этом его недостатки.
Эти два языка могут сосуществовать, предлагая разработчикам выбор в зависимости от их целей и навыков. У TrapC есть все шансы занять свою нишу среди языков программирования, активно используемых в критически важных областях. Но станет ли он популярным? Как говорят, поживем — увидим.