TrapC: безопасный «наследник» C и C++. Что за язык?

d282949aa9751b26ffd3d1bc7facd160.png

Стартап Trasec разрабатывает новый язык программирования, который называется TrapC. Авторы проекта провозглашают его «наследником» C и C++. ЯП обещает устранить главные проблемы «предков», включая небезопасное управление памятью. Для этого в TrapC внедрены автоматические проверки и защита программ от типичных ошибок. Это делает невозможным выход за границы буфера или обращение к несуществующей памяти и значительно усложняет жизнь хакерам. Давайте оценим новинку.

В чем проблема C и C++

a1acf9431f9cb881a7eed8715924741f.jpg

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 есть все шансы занять свою нишу среди языков программирования, активно используемых в критически важных областях. Но станет ли он популярным? Как говорят, поживем — увидим.

© Habrahabr.ru