Assessing Your C Programming Skills
This lab will give you practice in the style of programming you will need to be able to do proficiently, especially for the later assignments in the class. The material covered should all be review for you. Some of the skills tested are:
The lab involves implementing a queue, supporting both last-in, first-out (LIFO) and first-in-first-out (FIFO) queueing disciplines. The underlying data structure is a circular doubly-linked list, enhanced to make some of the operations more efficient.
There are a few prerequisites which must be installed on your machine before you will be able to build and run the autograders.
The following command will install all required and optional dependencies on Ubuntu Linux 20.04 or later:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Some distros like Arch Linux won't install aspell-en
with aspell
, and you must install it explicitly:
$ sudo pacman -S aspell-en
Note: Cppcheck version must be at least 1.90, otherwise
it might report errors with false positives. You can get its version by executing $ cppcheck --version
.
Check Developer Info for building Cppcheck from source.
clang-format
to vim
If you want to run clang-format
automatically after saving with vim,
clang-format supports integration for vim according to Clang documentation.
By adding the following into $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()
Then, it has zero-effort integration into the coding workflow since it can handle formatting changes while saving a file.
Note: on Ubuntu Linux 18.04, the path to clang-format.py
is /usr/share/vim/addons/syntax/
.
Before running the autograders, compile your code to create the testing program qtest
$ make
Check the correctness of your code, i.e. autograders:
$ make test
Check the example usage of qtest
:
$ make check
Each step about command invocation will be shown accordingly.
Check the memory issue of your code:
$ make valgrind
./.valgrindrc
to customize arguments of Valgrind$ make clean
or $ rm /tmp/qtest.*
to clean the temporary files created by target valgrindExtra options can be recognized by make:
VERBOSE
: control the build verbosity. If VERBOSE=1
, echo each command in build process.SANITIZER
: enable sanitizer(s) directed build. At the moment, AddressSanitizer is supported.qtest
qtest
provides a command interpreter that can create and manipulate queues.
Run $ ./qtest -h
to see the list of command-line options
When you execute $ ./qtest
, it will give a command prompt cmd>
. Type
help
to see a list of available commands.
You will handing in these two files
queue.h
: Modified version of declarations including new fields you want to introducequeue.c
: Modified version of queue code to fix deficiencies of original codeTools for evaluating your queue code
Makefile
: Builds the evaluation program qtest
README.md
: This filescripts/driver.py
: The driver program, runs qtest
on a standard set of tracesscripts/debug.py
: The helper program for GDB, executes qtest
without SIGALRM and/or analyzes generated core dump file.Helper files
console.{c,h}
: Implements command-line interpreter for qtestreport.{c,h}
: Implements printing of information at different levels of verbosityharness.{c,h}
: Customized version of malloc/free/strdup to provide rigorous testing frameworkqtest.c
: Code for qtest
Trace files
traces/trace-XX-CAT.cmd
: Trace files used by the driver. These are input files for qtest
.
traces/trace-eg.cmd
: A simple, documented trace file to demonstrate the operation of qtest
Before using GDB debug qtest
, there are some routine instructions need to do. The script scripts/debug.py
covers these instructions and provides basic debug function.
$ 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>
When qtest
encountered Segmentation fault while it ran outside GDB, we could invoke GDB in the post-mortem debugging mode to figure out the bug.
The core dump file was created in the working directory of the 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 was integrated into qtest
, providing the following user-friendly features:
A small web server is already integrated within the qtest
command line interpreter,
and you may use it by running the web
command in its prompt.
$ ./qtest
cmd> web
listen on port 9999, fd is 3
Run the following commands in another terminal after the built-in web server is ready.
$ 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
is released under the BSD 2 clause license. Use of this source code is governed by
a BSD-style license that can be found in the LICENSE file.
External source code: