Трассировка и защита памяти

Strace

https://strace.io

ИРЛ:

Пример: берём getline — что может пойти не так?

$ strace -eread -P /usr/share/dict/linux.words -e fault=read:error=EPERM:when=5 -y ./a.out /usr/share/dict/words > o

Другие похожие инструменты

Файл с примером:

   1 #include <stdio.h>
   2 #include <string.h>
   3 #include <stdlib.h>
   4 
   5 int main(int argc, char *argv[]) {
   6         int i;
   7         char *s;
   8 
   9         s = strdup(argv[argc-1]);
  10         for(i=0; i<4; i++)
  11                 printf("%s: %d, %d\n", s, rand(), i*2+1);
  12 
  13         return 0;
  14 }

   1 #include<stdio.h>
   2 #define TELEPORT 12
   3 
   4 void f()
   5 {
   6     int j=20;
   7     int* a = &j;
   8     *(a+TELEPORT)+=7;
   9 }
  10 
  11 int main()
  12 {
  13     int i;
  14     i=20;
  15     printf("\n i = %d \n", i);
  16     f();
  17     printf("\n i = %d \n", i);
  18     return 0;
  19 }

Огороды памяти

Valgrind

https://valgrind.org

Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.

Д/З

  1. Прочитать про
  2. Написать программу move.c, принимающую два параметра в командной строке: move infile outfile, которая перемещает содержимое файла infile в файл outfile (если таковой был, его содержимое удаляется), и в случае успеха удаляет infile.

    • Программа должна проверять по возможности все возможные ошибки и сообщать о них, в том числе выставляя различный код ошибки
    • Программа должна по возможности работать безопасно — не удалять исходный файл, пока целевой не закрыт, удалять целевой файл и сохранять исходный, если есть подозрение, что что-то пошло не так
    • Написать тесты с помощью strace error injection, которые позволяют проверить как можно больше ошибочных ситуаций (проверяют код ошибки и наличие того файла, который должен был остаться ☺)

    • Написать .so библиотеку для LD_PRELOAD, при подгрузке которой файл, в имени которого есть строка "PROTECT", не удаляется (как минимум — не удаляется при помощи вашего move). Написать тест, который это проверяет

    • Как обычно, написать Makefile со сборкой, запусками тестов и очисткой генератов

  3. Создать в репозитории каталог 06_TracingFencing и положить туда решение задачи

LecturesCMC/LinuxApplicationDevelopment2021/06_TracingFencing (последним исправлял пользователь FrBrGeorge 2021-10-24 11:22:19)