评估您的 C 编程技能
本实验将为您提供需要能够熟练完成的编程风格的练习,特别是对于课程中后面的作业。所涵盖的材料都应该供您审阅。测试的一些技能是:
该实验室涉及实现一个队列,支持后进先出 (LIFO) 和先进先出 (FIFO) 排队规则。底层数据结构是循环双向链表,经过增强以使某些操作更加高效。
在您能够构建和运行自动评分器之前,必须在您的计算机上安装一些先决条件。
以下命令将在 Ubuntu Linux 20.04 或更高版本上安装所有必需和可选的依赖项:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
某些发行版(例如 Arch Linux)不会使用aspell
安装aspell-en
,您必须显式安装它:
$ sudo pacman -S aspell-en
注意:Cppcheck版本必须至少为1.90,否则可能会报错误报。您可以通过执行$ cppcheck --version
来获取其版本。检查开发人员信息以从源代码构建 Cppcheck。
clang-format
集成到vim
如果你想在使用 vim 保存后自动运行clang-format
,根据 Clang 文档,clang-format 支持与 vim 集成。
通过将以下内容添加到$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 创建的临时文件make 可以识别额外的选项:
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 的帮助程序,在没有 SIGALRM 的情况下执行qtest
和/或分析生成的核心转储文件。帮助文件
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
的操作在使用 GDB debug qtest
之前,需要执行一些常规指令。脚本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 服务器,您可以通过在提示符中运行web
命令来使用它。
$ ./qtest
cmd > web
listen on port 9999, fd is 3
内置Web服务器准备就绪后,在另一个终端中运行以下命令。
$ 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 文件中找到。
外部源代码: