Стартап Trasec развива програмния език TrapC, който представлява диалект на езика C, осигуряващ безопасна работа с паметта. За блокиране на грешки при работа с паметта, като излизане извън границите на заделен буфер и достъп до вече освободена памет, в TrapC се прилага фундаментално различен подход към указателите и специален механизъм за прихващане на грешки, базиран на обработка на изключения (trap). Изходният код на компилатора за TrapC планират да бъде отворен през 2025 година.
Заявено е, че особеностите при работа с указатели ще бъдат реализирани по начин, който да не нарушава привичния ред, благодарение на компилатора. Според замисъла на авторите на езика, компилаторът ще гарантира, че указателите сочат само към техните свързани области на памет, а също така ще проверява всички граници на буферите. Компилаторът запомня типовете и не допуска небезопасно привеждане на типове. Всички създадени променливи и буфери могат да бъдат явна инициализирани или запълнени с нули от компилатора.
Вместо malloc в TrapC се използва подобен на C++ конструктор new. Вызовите free и delete отсъстват, а за освобождаването на паметта отговаря компилаторът, което защитава от грешки, водещи до загуби на памет. В купата се прилага инкрементално автоматично управление на паметта, но без събирач на боклук. На ниво ABI TrapC ще бъде съвместим със C, което позволява комбинирането на код на TrapC и чист C в едно приложение, но за кода на C няма да бъде осигурена безопасност при работа с паметта.
Проектът се развива от Робин Роу (Robin Rowe), бивш професор по компютърни науки, участвал в комитети за развитие на стандартите C и C++, който в своето време е създал графичен редактор 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 имплицитно нулира, без мръсна памет int success = 0;\/\/ В C, препълването на буфера коруптира success strcpy(buff,argv[1]); \/\/ TrapC не може да прелее, strcpy безопасно if(!strcmp(buff,"s3cr8tpw")) { success = 1; } if(success) \/\/ TrapC блокирано препълване с strcpy, success добре { printf("Welcome!\n"); } return !success; } \/\/ trapc_ptr.c int main() { const char* ptr = "Hello World"; \/\/ 12 символа широк while(ptr) \/\/ Няма препълване на буфера с TrapC { printf("%c",*ptr); \/\/ печатаме по един символ ptr++; \/\/ Стъпва извън края: TrapC нулира ptr! } \/\/ НЕ опитвайте това в C, ще се получи сегфал! assert(ptr == 0); return 0; } \/\/ trapc_array.c int score[10]; printf("%i",score[-1]); \/\/ TrapC няма да позволи достъп for(int i = 0;i
Източник: opennet.ru
