Задание по лекции 06_Tracing
(Общие замечания см. тут)
Рассматривается следующее решение:
- Ровно два параметра командной строки, остальные варианты считаются ошибочными
- Определить размер входного файла
- Завести буфер соответствующего размера
- Прочитать файл
- Записать в выходной файл
Трюк с LD_PRELOAD полностью берётся из лекции.
В таком решении — минимум 10 мест для проверки ошибок. Ошибки, которые можно вызвать с помощью вброса, помечены
- Количество параметров командной строки
Открыть файл на чтение
Выяснить размер файла
- Завести буфер
Прочесть файл в буфер
Закрыть файл
Открыть файл на запись
Записать буфер
Закрыть файл
Удалить старый файл
Условие сдачи
По команде make собирается программа и библиотека, а по команде make test запускается какое-то количество тестов на вброс ошибки и тест на неудаление; все тесты успешны.
Компоненты автоматической проверки
В репозитории есть файлы Makefile и *.[ch]
В репозитории есть файл, содержащий подстроки "strace" и "fault=" (это может быть Makefile, а может быть вспомогательный сценарий)
В репозитории есть файл, содержащий подстроку "LD_PRELOAD" (это может быть Makefile, а может быть вспомогательный сценарий)
В Makefile есть подстроки ".so:", "test:"" и "clean:"
В репозитории нет генератов *.o, *.so и файлов формата ELF
Обязательная составляющая
- В коде проверены все возможные ошибки (в примере их 10)
Допустимо не проверять unlink(выходной_файл), когда он вызывается при обработке
- Команда работает одинаково, независимо от того, существовал ли выходной файл до её запуска или нет
Необязательная составляющая
- Написаны тесты для других вариантов ошибок — (например, в параметрах командной строки)
Написан тест на malloc() (например, с помощью prlimit)
Отслежены результаты unlink(выходной_файл), когда он вызывается при обработке
Варианты ошибок
Некоторые из приведённых ошибок можно считать мелкими недочётами или ситуациями, требующими неоправданно глубокого анализа — возможно, их не стоит учитывать при выставлении баллов. Помечены
- Тестируются не все системные вызовы (в примере тестов должно быть 9)
Допустимо не тестировать unlink(выходной_файл), когда он вызывается при обработке
- Не определяется контекст вброса ошибки, и вброс срабатывает слишком рано — например, при загрузке программы и её зависимостей в память
- Некоторые тесты выдают ложноположительные или ложноотрицательные срабатывания
Для трассировки функции write() при указании параметра -P файл этот параметр должен быть полным путём в случае, если он есть, и кратким, если его ещё нет; лучше указать оба: -P файл -P $(realpath файл).
Программа создаёт файл с правами ---------
- Проверка ошибок явно выдаёт одинаковые коды ошибок
- Программа не удаляет выходной файл при ошибке/
- Допустимо не удалять выходной файл, если он уже сформирован и закрыт
- Программа удаляет входной файл при ошибке
Подгрузка библиотеки приводит к тому, что входной файл сохраняется, даже если его имя не содержит "PROTECT" (например, так называется только выходной файл)
- Программа падает в процессе работы