あなたの 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
と入力すると、使用可能なコマンドのリストが表示されます。
この 2 つのファイルを提出していただきます
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 デバッグ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
に統合され、次の使いやすい機能を提供します。
小規模な Web サーバーはすでにqtest
コマンド ライン インタープリター内に統合されており、プロンプトで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 条項ライセンスに基づいてリリースされています。このソース コードの使用は、LICENSE ファイルにある BSD スタイルのライセンスによって管理されます。
外部ソースコード: