Проект TrapC развива Си-подобен език, безопасно работещ с паметта.

Стартап Trasec разработва език за програмиране TrapC, който представлява диалект на езика C, осигуряващ безопасна работа с паметта. За предотвратяване на грешки при работа с паметта, като излизане извън границите на разпределения буфер и достъп до вече освободена памет, в TrapC се прилага съвсем различен подход към указателите и специален механизъм за прихващане на грешки, основаващ се на обработчици на изключения (trap). Изходният код на компилатора за TrapC планират да бъде отворен през 2025 година.

Заявено е, че особеностите на работата с указатели по възможност няма да нарушават познатия ред и ще бъдат реализирани от компилатора. Според замисъла на авторите на езика компилаторът ще гарантира, че указателите сочат само към свързаните с тях области на паметта, а също така ще проверява всички граници на буферите. Компилаторът запомня типовете и не допуска небезопасно преобразуване на типовете. Всички създавани променливи и буфери изрично се инициализират или се запълват с нули от компилатора.

Вместо malloc в TrapC се използва конструкторът new, подобен на C++. Извикванията на 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("Добре дошли!\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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster