Evaluación de sus habilidades de programación en C
Esta práctica de laboratorio le brindará práctica en el estilo de programación que necesitará para poder realizar de manera competente, especialmente para las tareas posteriores de la clase. Todo el material cubierto debe ser revisado por usted. Algunas de las habilidades evaluadas son:
El laboratorio implica implementar una cola, que admite disciplinas de cola de último en entrar, primero en salir (LIFO) y primero en entrar, primero en salir (FIFO). La estructura de datos subyacente es una lista circular doblemente enlazada, mejorada para hacer que algunas de las operaciones sean más eficientes.
Hay algunos requisitos previos que deben instalarse en su máquina antes de poder construir y ejecutar los autograduadores.
El siguiente comando instalará todas las dependencias requeridas y opcionales en Ubuntu Linux 20.04 o posterior:
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Algunas distribuciones como Arch Linux no instalarán aspell-en
con aspell
y debes instalarlo explícitamente:
$ sudo pacman -S aspell-en
Nota: La versión de Cppcheck debe ser al menos 1.90; de lo contrario, podría informar errores con falsos positivos. Puede obtener su versión ejecutando $ cppcheck --version
. Consulte la información del desarrollador para crear Cppcheck desde la fuente.
clang-format
a vim
Si desea ejecutar clang-format
automáticamente después de guardar con vim, clang-format admite la integración para vim de acuerdo con la documentación de Clang.
Agregando lo siguiente en $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 ()
Luego, se integra sin esfuerzo en el flujo de trabajo de codificación, ya que puede manejar cambios de formato mientras guarda un archivo. Nota: en Ubuntu Linux 18.04, la ruta a clang-format.py
es /usr/share/vim/addons/syntax/
.
Antes de ejecutar los autograduadores, compile su código para crear el programa de prueba qtest
$ make
Verifique la exactitud de su código, es decir, autocalificadores:
$ make test
Consulte el ejemplo de uso de qtest
:
$ make check
Cada paso sobre la invocación de comandos se mostrará en consecuencia.
Verifique el problema de memoria de su código:
$ make valgrind
./.valgrindrc
para personalizar los argumentos de Valgrind$ make clean
o $ rm /tmp/qtest.*
para limpiar los archivos temporales creados por target valgrindLas opciones adicionales se pueden reconocer por marca:
VERBOSE
: controla la detalle de la compilación. Si VERBOSE=1
, repite cada comando en el proceso de compilación.SANITIZER
: habilita la compilación dirigida a los desinfectantes. Por el momento, se admite AddressSanitizer. qtest
qtest
proporciona un intérprete de comandos que puede crear y manipular colas.
Ejecute $ ./qtest -h
para ver la lista de opciones de la línea de comandos
Cuando ejecute $ ./qtest
, aparecerá un símbolo del sistema cmd>
. Escriba help
para ver una lista de comandos disponibles.
Entregarás estos dos archivos
queue.h
: versión modificada de las declaraciones que incluyen nuevos campos que desea introducirqueue.c
: versión modificada del código de cola para corregir deficiencias del código originalHerramientas para evaluar su código de cola
Makefile
: construye el programa de evaluación qtest
README.md
: este archivoscripts/driver.py
: el programa controlador ejecuta qtest
en un conjunto estándar de seguimientosscripts/debug.py
: el programa auxiliar para GDB ejecuta qtest
sin SIGALRM y/o analiza el archivo de volcado de núcleo generado.Archivos auxiliares
console.{c,h}
: Implementa el intérprete de línea de comandos para qtestreport.{c,h}
: Implementa la impresión de información en diferentes niveles de detalleharness.{c,h}
: versión personalizada de malloc/free/strdup para proporcionar un marco de pruebas rigurosoqtest.c
: Código para qtest
Archivos de seguimiento
traces/trace-XX-CAT.cmd
: archivos de seguimiento utilizados por el controlador. Estos son archivos de entrada para qtest
.traces/trace-eg.cmd
: un archivo de seguimiento simple y documentado para demostrar el funcionamiento de qtest
Antes de utilizar GDB debug qtest
, hay que seguir algunas instrucciones de rutina. El script scripts/debug.py
cubre estas instrucciones y proporciona una función de depuración básica.
$ 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 >
Cuando qtest
encontró un error de segmentación mientras se ejecutaba fuera de GDB, pudimos invocar GDB en el modo de depuración post-mortem para descubrir el error.
El archivo de volcado del núcleo se creó en el directorio de trabajo de 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 se integró en qtest
, proporcionando las siguientes funciones fáciles de usar:
Un pequeño servidor web ya está integrado dentro del intérprete de línea de comando qtest
y puede usarlo ejecutando el comando web
en su símbolo.
$ ./qtest
cmd > web
listen on port 9999, fd is 3
Ejecute los siguientes comandos en otra terminal después de que el servidor web integrado esté listo.
$ 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
se publica bajo la licencia de cláusula BSD 2. El uso de este código fuente se rige por una licencia estilo BSD que se puede encontrar en el archivo LICENCIA.
Código fuente externo: