Startup Trasec rozwija język programowania TrapC, będący dialektem języka C, który zapewnia bezpieczną obsługę pamięci. Aby zablokować błędy związane z pamięcią, takie jak przekroczenie przydzielonego bufora czy dostęp do już zwolnionej pamięci, w TrapC zastosowano całkowicie odmienny sposób obsługi wskaźników oraz specjalny mechanizm wychwytywania błędów oparty na obsłudze wyjątków (trap). Kod źródłowy kompilatora dla TrapC planuje się udostępnić w 2025 roku.
Zgłoszono, że zasady pracy z wskaźnikami będą w miarę możliwości w zgodzie z dotychczasowymi praktykami i będą realizowane przez kompilator. Twórcy języka zakładają, że kompilator gwarantowałby, że wskaźniki odnoszą się wyłącznie do związanych z nimi obszarów pamięci oraz że sprawdzałby wszystkie granice buforów. Kompilator zapamiętuje typy i nie dopuszcza niebezpiecznego rzutowania typów. Wszystkie tworzone zmienne i bufory są jednoznacznie inicjalizowane lub wypełniane zerami przez kompilator.
Zamiast malloc w TrapC używany jest podobny do C++ konstruktor new. Wywołania free i delete są nieobecne, a za zwalnianie pamięci odpowiedzialny jest kompilator, co chroni przed błędami prowadzącymi do wycieków pamięci. W przypadku pamięci dynamicznej stosowane jest inkrementalne automatyczne zarządzanie pamięcią, ale bez zbieracza śmieci. Na poziomie ABI TrapC będzie kompatybilny z C, co pozwoli na łączenie w jednej aplikacji kodu w TrapC i czystym C, ale dla kodu C nie będzie zapewniona bezpieczeństwo pracy z pamięcią.
Projekt rozwija Robin Rowe, były profesor informatyki, który brał udział w pracach nad standardami C i C++, niegdyś tworzył edytor graficzny Cinepaint, używany przy produkcji niektórych filmów Hollywoodu oraz bibliotekę POSIX libunistd dla Windows. Współzałożycielem firmy Trasec jest Gabrielle Pantera, która zajmowała stanowisko kierownicze w firmie Disney.
Szczegóły projektu nie zostały jeszcze ujawnione, pokazano tylko kilka przykładów kodu, w którym na przykład stwierdzono, że TrapC nie pozwoli na przepełnienie bufora buff podczas wykonywania „strcpy(buff, argv[1]);” ani nie pozwoli na zwiększenie wskaźnika lub indeksu tablicy o wartości, która przesuwa je poza przydzielony bufor lub koniec tablicy. Jak dokładnie osiągnięto taką ochronę, nie zostało wyjaśnione. // darpa_tractor.c int main(int argc, char* argv[]) { char buff[8]; // TrapC automatycznie zeruje, brak brudnej pamięci int success = 0; // W C, przepełnienie bufora psuje success strcpy(buff, argv[1]); // TrapC nie może przelać, strcpy bezpieczne if (!strcmp(buff, "s3cr8tpw")) { success = 1; } if (success) // TrapC zablokował przepełnienie strcpy, success dobre { printf("Welcome!\n"); } return !success; } // trapc_ptr.c int main() { const char* ptr = "Hello World"; // 12 znaków szerokości while (ptr) // Brak przepełnienia bufora z TrapC { printf("%c", *ptr); // wyświetlaj jeden znak na raz ptr++; // Zdejmowanie z końca: TrapC zeruje ptr! } // NIE próbuj tego w C, spowoduje segfault! assert(ptr == 0); return 0; } // trapc_array.c int score[10]; printf("%i", score[-1]); // TrapC nie pozwoli na dostęp for (int i = 0; i
Źródło: opennet.ru
