• XSS.stack #1 – первый литературный журнал от юзеров форума

TrapC - Си-подобный язык, безопасно работающий с памятью

qazwsx123

DaMaGeLaB
Пользователь
Регистрация
08.11.2024
Сообщения
78
Реакции
98
Гарант сделки
2
Депозит
0.00
Стартап Trasec развивает язык программирования TrapC, представляющий собой диалект языка Си, обеспечивающий безопасную работу с памятью. Для блокирования ошибок при работе с памятью, таких как выход за границы выделенного буфера и обращение к уже освобождённой памяти, в TrapC применяется фундаментально иной способ работы с указателями и специальный механизм перехвата ошибок на основе обработчиков исключений (trap). Исходный код компилятора для TrapC планируют открыть в 2025 году.

Заявлено, что особенности работы с указателями по возможности не будут нарушать привычный уклад и будут реализовываться силами компилятора. По задумке авторов языка компилятор будет гарантировать, что указатели ссылаются только на связанные с ними области памяти, а также проверять все границы буферов. Компилятор запоминает типы и не допускает небезопасное приведение типов. Все создаваемые переменные и буферы явно инициализируются или заполняются нулями компилятором.

Вместо malloc в TrapC используется похожий на C++ конструктор new. Вызовы free и delete отсутствуют, а за освобождение памяти отвечает компилятор, что защищает от ошибок, приводящих к утечке памяти. В куче применяется инкрементальное автоматическое управление памятью, но без сборщика мусора. На уровне ABI TrapC будет совместим с Си, что позволит комбинировать в одном приложении код на TrapC и чистом Си, но для кода Си не будет обеспечиваться безопасность работы с памятью.

Подробности о проекте пока не приводятся, показано лишь несколько примеров с кодом, в котором, например, заявлено, что TrapC не даст переполнить буфер buff при выполнении "strcpy(buff, argv[1]);" или не даст увеличить указатель или индекс массива на значение, смещающее его за пределы выделенного буфера или конца массива. Как именно достигается подобная защита не поясняется.

Дополнение: Опубликована видеозапись презентации языка TrapC, анонсированного на проходящей в Бангкоке конференции W2140.

Примеры кода:
C:
// 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 <= INT_MAX; i++) // C Undefined Behavior
{  
  printf("%i", i);
}

// In C, above code is an infinite loop, will not stop.  
// TrapC blocks i++ overflow wrap-around, stops.
// TrapC will fail-safe, call error handler if defined.

Источник: opennet.ru
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх