Évaluation de vos compétences en programmation C
Ce laboratoire vous permettra de pratiquer le style de programmation que vous devrez maîtriser avec compétence, en particulier pour les travaux ultérieurs en classe. Le matériel couvert devrait tous être révisé pour vous. Certaines des compétences testées sont :
Le laboratoire implique la mise en œuvre d'une file d'attente, prenant en charge les disciplines de file d'attente dernier entré, premier sorti (LIFO) et premier entré, premier sorti (FIFO). La structure de données sous-jacente est une liste circulaire à double lien, améliorée pour rendre certaines opérations plus efficaces.
Quelques conditions préalables doivent être installées sur votre ordinateur avant de pouvoir créer et exécuter les niveleuses automatiques.
La commande suivante installera toutes les dépendances obligatoires et facultatives sur Ubuntu Linux 20.04 ou version ultérieure :
$ sudo apt install build-essential git clang-format cppcheck aspell colordiff valgrind
Certaines distributions comme Arch Linux n'installeront pas aspell-en
avec aspell
, et vous devez l'installer explicitement :
$ sudo pacman -S aspell-en
Remarque : la version de Cppcheck doit être au moins 1.90, sinon elle pourrait signaler des erreurs avec des faux positifs. Vous pouvez obtenir sa version en exécutant $ cppcheck --version
. Vérifiez les informations du développeur pour créer Cppcheck à partir des sources.
clang-format
à vim
Si vous souhaitez exécuter clang-format
automatiquement après avoir enregistré avec vim, clang-format prend en charge l'intégration pour vim selon la documentation Clang.
En ajoutant ce qui suit dans $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 ()
Ensuite, il s'intègre sans effort dans le flux de travail de codage puisqu'il peut gérer les modifications de formatage lors de l'enregistrement d'un fichier. Remarque : sur Ubuntu Linux 18.04, le chemin d'accès à clang-format.py
est /usr/share/vim/addons/syntax/
.
Avant d'exécuter les niveleuses automatiques, compilez votre code pour créer le programme de test qtest
$ make
Vérifiez l'exactitude de votre code, c'est-à-dire les niveleuses automatiques :
$ make test
Vérifiez l'exemple d'utilisation de qtest
:
$ make check
Chaque étape concernant l'invocation de la commande sera affichée en conséquence.
Vérifiez le problème de mémoire de votre code :
$ make valgrind
./.valgrindrc
pour personnaliser les arguments de Valgrind$ make clean
ou $ rm /tmp/qtest.*
pour nettoyer les fichiers temporaires créés par target valgrindDes options supplémentaires peuvent être reconnues par marque :
VERBOSE
: contrôle la verbosité de la construction. Si VERBOSE=1
, faites écho à chaque commande dans le processus de construction.SANITIZER
: active la construction dirigée par le(s) désinfectant(s). Pour le moment, AddressSanitizer est pris en charge. qtest
qtest
fournit un interpréteur de commandes capable de créer et de manipuler des files d'attente.
Exécutez $ ./qtest -h
pour voir la liste des options de ligne de commande
Lorsque vous exécutez $ ./qtest
, une invite de commande cmd>
s'affichera. Tapez help
pour voir une liste des commandes disponibles.
Vous remettrez ces deux dossiers
queue.h
: Version modifiée des déclarations incluant les nouveaux champs que vous souhaitez introduirequeue.c
: version modifiée du code de file d'attente pour corriger les lacunes du code d'origineOutils pour évaluer votre code de file d'attente
Makefile
: Construit le programme d'évaluation qtest
README.md
: Ce fichierscripts/driver.py
: Le programme pilote exécute qtest
sur un ensemble standard de tracesscripts/debug.py
: Le programme d'assistance pour GDB, exécute qtest
sans SIGALRM et/ou analyse le fichier core dump généré.Fichiers d'aide
console.{c,h}
: Implémente un interpréteur de ligne de commande pour qtestreport.{c,h}
: Implémente l'impression d'informations à différents niveaux de verbositéharness.{c,h}
: version personnalisée de malloc/free/strdup pour fournir un cadre de test rigoureuxqtest.c
: Code pour qtest
Fichiers de traces
traces/trace-XX-CAT.cmd
: Fichiers de trace utilisés par le pilote. Ce sont des fichiers d'entrée pour qtest
.traces/trace-eg.cmd
: Un fichier de trace simple et documenté pour démontrer le fonctionnement de qtest
Avant d'utiliser GDB debug qtest
, certaines instructions de routine doivent être effectuées. Le script scripts/debug.py
couvre ces instructions et fournit une fonction de débogage de base.
$ 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 >
Lorsque qtest
rencontrait une erreur de segmentation alors qu'il s'exécutait en dehors de GDB, nous pouvions appeler GDB en mode de débogage post-mortem pour comprendre le bogue.
Le fichier core dump a été créé dans le répertoire de travail 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 a été intégré à qtest
, offrant les fonctionnalités conviviales suivantes :
Un petit serveur Web est déjà intégré à l'interpréteur de ligne de commande qtest
et vous pouvez l'utiliser en exécutant la commande web
dans son invite.
$ ./qtest
cmd > web
listen on port 9999, fd is 3
Exécutez les commandes suivantes dans un autre terminal une fois que le serveur Web intégré est prêt.
$ 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
est publié sous la licence clause BSD 2. L'utilisation de ce code source est régie par une licence de type BSD qui se trouve dans le fichier LICENSE.
Code source externe :