Avaliando suas habilidades de programação C
Este laboratório lhe dará prática no estilo de programação que você precisará ser capaz de executar com proficiência, especialmente para as tarefas posteriores da aula. Todo o material abordado deve ser revisado para você. Algumas das habilidades testadas são:
O laboratório envolve a implementação de uma fila, suportando disciplinas de filas último a entrar, primeiro a sair (LIFO) e primeiro a entrar, primeiro a sair (FIFO). A estrutura de dados subjacente é uma lista circular duplamente vinculada, aprimorada para tornar algumas das operações mais eficientes.
Existem alguns pré-requisitos que devem ser instalados em sua máquina antes que você possa construir e executar os autoniveladores.
O comando a seguir instalará todas as dependências necessárias e opcionais no Ubuntu Linux 20.04 ou posterior:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Algumas distros como Arch Linux não instalam aspell-en
com aspell
e você deve instalá-lo explicitamente:
$ sudo pacman -S aspell-en
Nota: A versão do Cppcheck deve ser pelo menos 1.90, caso contrário poderá reportar erros com falsos positivos. Você pode obter sua versão executando $ cppcheck --version
. Verifique as informações do desenvolvedor para construir o Cppcheck a partir da fonte.
clang-format
ao vim
Se você deseja executar clang-format
automaticamente após salvar com o vim, o clang-format suporta integração para o vim de acordo com a documentação do Clang.
Adicionando o seguinte em $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 ()
Além disso, ele tem integração sem esforço ao fluxo de trabalho de codificação, pois pode lidar com alterações de formatação enquanto salva um arquivo. Nota: no Ubuntu Linux 18.04, o caminho para clang-format.py
é /usr/share/vim/addons/syntax/
.
Antes de executar os autoniveladores, compile seu código para criar o programa de teste qtest
$ make
Verifique a exatidão do seu código, ou seja, autoniveladores:
$ make test
Verifique o exemplo de uso de qtest
:
$ make check
Cada etapa sobre a invocação do comando será mostrada de acordo.
Verifique o problema de memória do seu código:
$ make valgrind
./.valgrindrc
para personalizar os argumentos do Valgrind$ make clean
ou $ rm /tmp/qtest.*
para limpar os arquivos temporários criados pelo target valgrindOpções extras podem ser reconhecidas por marca:
VERBOSE
: controla a verbosidade da construção. Se VERBOSE=1
, faça eco de cada comando no processo de construção.SANITIZER
: habilita a construção direcionada ao(s) desinfetante(s). No momento, o AddressSanitizer é compatível. qtest
qtest
fornece um interpretador de comandos que pode criar e manipular filas.
Execute $ ./qtest -h
para ver a lista de opções de linha de comando
Quando você executa $ ./qtest
, será exibido um prompt de comando cmd>
. Digite help
para ver uma lista de comandos disponíveis.
Você entregará esses dois arquivos
queue.h
: Versão modificada das declarações incluindo novos campos que você deseja introduzirqueue.c
: versão modificada do código da fila para corrigir deficiências do código originalFerramentas para avaliar seu código de fila
Makefile
: Constrói o programa de avaliação qtest
README.md
: Este arquivoscripts/driver.py
: O programa do driver executa qtest
em um conjunto padrão de rastreamentosscripts/debug.py
: O programa auxiliar para GDB, executa qtest
sem SIGALRM e/ou analisa o arquivo core dump gerado.Arquivos auxiliares
console.{c,h}
: Implementa interpretador de linha de comando para qtestreport.{c,h}
: Implementa a impressão de informações em diferentes níveis de verbosidadeharness.{c,h}
: versão personalizada de malloc/free/strdup para fornecer uma estrutura de testes rigorosaqtest.c
: Código para qtest
Arquivos de rastreamento
traces/trace-XX-CAT.cmd
: arquivos de rastreamento usados pelo driver. Estes são arquivos de entrada para qtest
.traces/trace-eg.cmd
: Um arquivo de rastreamento simples e documentado para demonstrar a operação do qtest
Antes de usar o GDB debug qtest
, há algumas instruções de rotina que precisam ser executadas. O script scripts/debug.py
cobre essas instruções e fornece funções básicas de depuração.
$ 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 >
Quando qtest
encontrou uma falha de segmentação enquanto era executado fora do GDB, poderíamos invocar o GDB no modo de depuração post-mortem para descobrir o bug.
O arquivo core dump foi criado no diretório de trabalho do 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 foi integrado ao qtest
, fornecendo os seguintes recursos fáceis de usar:
Um pequeno servidor web já está integrado ao interpretador de linha de comando qtest
e você pode usá-lo executando o comando web
em seu prompt.
$ ./qtest
cmd > web
listen on port 9999, fd is 3
Execute os seguintes comandos em outro terminal depois que o servidor web integrado estiver pronto.
$ 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
é lançado sob a licença da cláusula BSD 2. O uso deste código-fonte é regido por uma licença estilo BSD que pode ser encontrada no arquivo LICENSE.
Código-fonte externo: