Различия между версиями 6 и 7
Версия 6 от 2021-10-24 11:21:41
Размер: 7081
Редактор: FrBrGeorge
Комментарий:
Версия 7 от 2021-10-24 11:22:19
Размер: 7104
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 143: Строка 143:
 1. Написать программу `move.c`, принимающую два параметра в командной строке: `move infile outfile`, которая перемещает содержимое файла `infile` в файл `outfile` (если таковой был, он удаляется), и в случае успеха удаляет `infile`.  1. Написать программу `move.c`, принимающую два параметра в командной строке: `move infile outfile`, которая перемещает содержимое файла `infile` в файл `outfile` (если таковой был, его содержимое удаляется), и в случае успеха удаляет `infile`.

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

Strace

https://strace.io

  • Отслеживание системных вызовов с помощью ptrace

    • + вывод сопутствующей информации
  • + у всех подпроцессов
    • -f, -foo

  • + фильтр на вызовы/группы
    • -eexecve

  • + трассировка стека вызовов -k и показ параметров (-s###, -v)

  • ptrace_scope и strace / gdb с ключом -p

  • + вброс ошибок

ИРЛ:

  • Какие файлы (не) открывает (в т. ч. все открываемые файлы)

    • -y

  • Почему висит
  • Куда полезло в сеть
  • Что куда пишет/читает
  • Что сделает, если syscall обломается
  • strace — руководство

  • Две статьи на хабре: первая и вторая

Пример: берём 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 }
  • ld.soLD_PRELOAD, LD_LIBRARY_PATH и т. д.

    • LD_PRELOAD trick (another one)

    • Простой пример:
         1 int rand(){
         2     return 42; //the most random number in the universe
         3 
      
    • And now:
      $ cc -shared -o ura.so ura.c
      $ cc ranex.c -o randex
      $ ./randex
      $ LD_PRELOAD=`pwd`/ura.so ./randex
    • Обёртка вместо подмены: поиск исходной функции
  • ldd

  • ltrace

   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 }
  • cc -fstack-protector-all

  • cc -fsanitize=address

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

  • EFence/DUMA
       1 #include <malloc.h>
       2 void main() {
       3     int *pi = (int*)malloc(10*sizeof(int));
       4     int i;
       5     for(i=0; i<11; ++i)
       6         pi[i]=i;
       7 }
    
  • *malloc проекты (gperftools, jmalloc, memalloc …)
  • libmemleak и ему подобные

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)