ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ 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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru