Startup Trasec vyvíja programovací jazyk TrapC, ktorý je dialektom jazyka C, zaisťujúcim bezpečnú prácu s pamäťou. Na zabránenie chýb pri práci s pamäťou, ako je pretečenie vyhradeného buffera a prístup k už uvoľnenej pamäti, sa v TrapC aplikuje zásadne odlišný spôsob práce s ukazovateľmi a špeciálny mechanizmus zachytávania chýb na základe prístupníkov výnimiek (trap). Zdrojový kód kompilátora pre TrapC plánujú sprístupniť v roku 2025.
Je vyhlásené, že vlastnosti práce s ukazovateľmi budú čo najviac zachovávať obvyklý poriadok a budú realizované silou kompilátora. Podľa autorov jazyka bude kompilátor garantovať, že ukazovatele sa odkazujú len na priradené oblasti pamäte a takisto kontrolovať všetky hranice bufferov. Kompilátor si pamätá typy a nedovolí nebezpečné prevody typov. Všetky vytvárané premenné a buffery sú výslovne inicializované alebo naplnené nulami kompilátorom.
Namiesto malloc v TrapC sa používa konštruktor new, ktorý je podobný C++. Volania free a delete chýbajú a za uvoľnenie pamäte zodpovedá kompilátor, čo chráni pred chybami vedúcimi k úniku pamäte. V haldách sa aplikuje inkrementálne automatické riadenie pamäte, ale bez zberača odpadu. Na úrovni ABI bude TrapC kompatibilný s C, čo umožní kombinovať v jednej aplikácii kód na TrapC a čistom C, ale pre kód C nebude zabezpečená bezpečná práca s pamäťou.
Projekt vedie Robin Rowe, bývalý profesor informatických vied, ktorý sa zúčastnil na komitodoch pre vývoj štandardov C a C++, ktorý vytvoril grafický editor Cinepaint, používaný pri vytváraní niektorých hollywoodskych filmov, a POSIX knižnicu libunistd pre Windows. Spoluzakladateľom spoločnosti Trasec je Gabrielle Pantera, ktorá zastávala vedúcu pozíciu v spoločnosti Disney.
O podrobnostiach projektu zatiaľ neboli poskytnuté žiadne informácie, ukázané sú len niektoré príklady kódu, v ktorých sa uvádza, že TrapC zabráni pretečeniu bufferu buff pri vykonávaní „strcpy(buff, argv[1]);“ alebo nezvýši ukazovateľ alebo index poľa o hodnotu, ktorá by ho posunula za hranice prideleného bufferu alebo konca poľa. Ako sa takáto ochrana dosahuje, nie je objasnené.// darpa_tractor.c int main(int argc, char* argv[]) { char buff[8]; // TrapC implicitne vynuluje, žiadna znečistená pamäť int success = 0; // V C sa prepísanie bufferu pokazí úspech strcpy(buff, argv[1]); // TrapC nemôže prekročiť, strcpy je bezpečný if(!strcmp(buff, "s3cr8tpw")) { success = 1; } if(success) // TrapC zablokoval prepísanie strcpy, úspech je dobrý { printf("Vitajte!\n"); } return !success; }// trapc_ptr.c int main() { const char* ptr = "Hello World"; // 12 charakterov while(ptr) // Žiadne pretečenie bufferu s TrapC { printf("%c", *ptr); // vytlačiť jeden znak po druhom ptr++; // Krok mimo konca: TrapC nastaví ptr na null! } // NEPOKÚŠAJTE SA TO V C, spôsobí segfault! assert(ptr == 0); return 0; }// trapc_array.c int score[10]; printf("%i", score[-1]); // TrapC nedovolí prístup for(int i = 0; i
Zdroj: opennet.ru
