Оценка ваших навыков программирования на C
Эта лабораторная работа даст вам возможность попрактиковаться в том стиле программирования, который вам понадобится, особенно для последующих заданий в классе. Весь изложенный материал должен быть рассмотрен вами. Некоторые из проверяемых навыков:
Лабораторная работа предполагает реализацию очереди, поддерживающей принципы организации очередей «последним пришел — первым обслужен» (LIFO) и «первым пришел — первым обслужен» (FIFO). Базовая структура данных представляет собой циклический двусвязный список, улучшенный для повышения эффективности некоторых операций.
Прежде чем вы сможете собирать и запускать автогрейдеры, на вашем компьютере необходимо установить несколько предварительных условий.
Следующая команда установит все необходимые и дополнительные зависимости в Ubuntu Linux 20.04 или более поздней версии:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Некоторые дистрибутивы, такие как Arch Linux, не устанавливают aspell-en
с помощью aspell
, и вы должны установить его явно:
$ sudo pacman -S aspell-en
Примечание. Версия Cppcheck должна быть не ниже 1.90, в противном случае она может сообщать об ошибках с ложными срабатываниями. Вы можете получить его версию, выполнив $ cppcheck --version
. Проверьте информацию о разработчике для сборки Cppcheck из исходного кода.
clang-format
в vim
Если вы хотите автоматически запускать clang-format
после сохранения с помощью vim, clang-format поддерживает интеграцию с vim согласно документации Clang.
Добавив следующее в $HOME/.vimrc
function ! Formatonsave ()
let l:formatdiff = 1
py3f < path-to-clang-format.py > /clang-format.py
endfunction
autocmd BufWritePre * .h, * .hpp, * .c, * .cc, * .cpp call Formatonsave ()
Кроме того, он легко интегрируется в рабочий процесс кодирования, поскольку может обрабатывать изменения форматирования при сохранении файла. Примечание. В Ubuntu Linux 18.04 путь к clang-format.py
— /usr/share/vim/addons/syntax/
.
Прежде чем запускать автооценщики, скомпилируйте код, чтобы создать программу тестирования qtest
$ make
Проверьте корректность вашего кода, т.е. автогрейдеров:
$ make test
Проверьте пример использования qtest
:
$ make check
Каждый шаг вызова команды будет отображаться соответствующим образом.
Проверьте проблему с памятью вашего кода:
$ make valgrind
./.valgrindrc
, чтобы настроить аргументы Valgrind.$ make clean
или $ rm /tmp/qtest.*
для очистки временных файлов, созданных целевым valgrind.Дополнительные опции можно узнать по марке:
VERBOSE
: управление подробностью сборки. Если VERBOSE=1
, отображать каждую команду в процессе сборки.SANITIZER
: включить сборку, направленную на дезинфицирующие средства. На данный момент поддерживается AddressSanitizer. qtest
qtest
предоставляет интерпретатор команд, который может создавать очереди и управлять ими.
Запустите $ ./qtest -h
чтобы просмотреть список параметров командной строки.
Когда вы выполните $ ./qtest
, появится командная строка cmd>
. Введите help
чтобы просмотреть список доступных команд.
Вы сдадите эти два файла
queue.h
: измененная версия объявлений, включая новые поля, которые вы хотите добавить.queue.c
: измененная версия кода очереди для исправления недостатков исходного кода.Инструменты для оценки кода очереди
Makefile
: собирает оценочную программу qtest
README.md
: Этот файлscripts/driver.py
: программа-драйвер запускает qtest
со стандартным набором трассировок.scripts/debug.py
: вспомогательная программа для GDB выполняет qtest
без SIGALRM и/или анализирует сгенерированный файл дампа ядра.Вспомогательные файлы
console.{c,h}
: реализует интерпретатор командной строки для qtest.report.{c,h}
: реализует печать информации с разными уровнями детализации.harness.{c,h}
: индивидуальная версия malloc/free/strdup для обеспечения строгой среды тестирования.qtest.c
: код для qtest
Файлы трассировки
traces/trace-XX-CAT.cmd
: файлы трассировки, используемые драйвером. Это входные файлы для qtest
.traces/trace-eg.cmd
: простой документированный файл трассировки для демонстрации работы qtest
Прежде чем использовать qtest
отладки GDB, необходимо выполнить некоторые рутинные инструкции. Сценарий scripts/debug.py
охватывает эти инструкции и предоставляет базовую функцию отладки.
$ scripts/debug.py -h
usage: debug.py [-h] [-d | -a ]
optional arguments:
-h, --help show this help message and exit
-d, --debug Enter gdb shell
-a, --analyze Analyze the core dump file
$ scripts/debug.py -d
Reading symbols from lab0-c/qtest...done.
Signal Stop Print Pass to program Description
SIGALRM No No No Alarm clock
Starting program: lab0-c/qtest
cmd >
Когда qtest
обнаружил ошибку сегментации во время работы вне GDB, мы могли вызвать GDB в режиме посмертной отладки, чтобы выяснить ошибку.
Файл дампа ядра был создан в рабочем каталоге qtest
.
$ ulimit -c unlimited
$ ulimit -c
unlimited
$ scripts/debug.py -a
Reading symbols from lab0-c/qtest...done.
[New LWP 9424]
Core was generated by ` lab0-c/qtest ' .
Program terminated with signal SIGSEGV, Segmentation fault.
#0 ...
#1 ... (backtrace information)
#2 ...
(gdb)
linenoise был интегрирован в qtest
, предоставляя следующие удобные функции:
Небольшой веб-сервер уже интегрирован в интерпретатор командной строки qtest
, и вы можете использовать его, запустив web
команду в его командной строке.
$ ./qtest
cmd > web
listen on port 9999, fd is 3
Запустите следующие команды в другом терминале после того, как встроенный веб-сервер будет готов.
$ curl http://localhost:9999/new
$ curl http://localhost:9999/ih/1
$ curl http://localhost:9999/ih/2
$ curl http://localhost:9999/ih/3
$ curl http://localhost:9999/sort
$ curl http://localhost:9999/quit
lab0-c
выпускается под лицензией BSD 2. Использование этого исходного кода регулируется лицензией в стиле BSD, которую можно найти в файле LICENSE.
Внешний исходный код: