Проект TrapC развивает Си-подобный язык, безопасно работающий с памятью
Стартап Trasec развивает язык программирования TrapC, представляющий собой диалект языка Си, обеспечивающий безопасную работу с памятью. Для блокирования ошибок при работе с памятью, таких как выход за границы выделенного буфера и обращение к уже освобождённой памяти, в TrapC применяется фундаментально иной способ работы с указателями и специальный механизм перехвата ошибок на основе обработчиков исключений (trap). Исходный код компилятора для TrapC планируют открыть в 2025 году.Заявлено, что особенности работы с указателями по возможности не будут нарушать привычный уклад и будут реализовываться силами компилятора. По задумке авторов языка компилятор будет гарантировать, что указатели ссылаются только на связанные с ними области памяти, а также проверять все границы буферов. Компилятор запоминает типы и не допускает небезопасное приведение типов. Все создаваемые переменные и буферы явно инициализируются или заполняются нулями компилятором.
Вместо malloc в TrapC используется похожий на C++ конструктор new. Вызовы free и delete отсутствуют, а за освобождение памяти отвечает компилятор, что защищает от ошибок, приводящих к утечке памяти. В куче применяется инкрементальное автоматическое управление памятью, но без сборщика мусора. На уровне ABI TrapC будет совместим с Си, что позволит комбинировать в одном приложении код на TrapC и чистом Си, но для кода Си не будет обеспечиваться безопасность работы с памятью.
Проект развивает Робин Роу (Robin Rowe), бывший профессор компьютерных наук, принимавший участие в комитетах по развитию стандартов С и С++, в своё время создавший графический редактор Cinepaint, использовавшийся при создании некоторых голливудских фильмов, и POSIX-библиотеку libunistd для Windows. Соучредителем компании Trasec выступает Габриэль Пантера (Gabrielle Pantera), занимавшая руководящий пост в компании Disney.
Подробности о проекте пока не приводятся, показано лишь несколько примеров с кодом, в котором, например, заявлено, что 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.
Дополнение: Опубликована видеозапись презентации языка TrapC, анонсированного на проходящей в Бангкоке конференции W2140.
https://honk.any-key.press/d/G7KMBMSL3DRhJn1zPplP4.png
Источник: https://www.opennet.ru/opennews/art.shtml?num=62224