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-format은 Clang 문서에 따라 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
수정하세요.$ 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 디버그 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
명령을 실행하여 사용할 수 있습니다.
$ ./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 조항 라이센스에 따라 릴리스됩니다. 이 소스 코드의 사용은 LICENSE 파일에 있는 BSD 스타일 라이센스에 따라 관리됩니다.
외부 소스 코드: