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 스타일 라이센스에 따라 관리됩니다.
외부 소스 코드: