Week 8 tests segmentation fault

Week 8 tests segmentation fault

by José Pedro Costa Coelho -
Number of replies: 6

Bonjour,

J'ai voulu lancer les tests unit-test-cpu-dispatch-week08 et j'ai reçu une segmentation fault pour le test "test_LD_A_HLRU".

Après quelques recherches, j'ai remarqué que le problème venait lors de l'accès une valeur dans le bus (ligne 945). J'ai donc voulu comparer les pointeurs de la mémoire du composant qui est connecté au bus avec celui du bus (qui sont censé être identiques) et j'ai une différence à l'index 0 et 1. Voilà un print du pointeur dans le bus et celui dans la mémoire du component :

Pourtant ce que je trouve très bizarre c'est qui si je teste la différence entre la mémoire du composant et le bus avant la déclaration du tableau hlevd[] (à la ligne 937 du fichier unit-test-cpu-dispatch-week08.c originel), il n'y a aucune différence.

J'avoue ne pas comprendre ce comportement et je suis curieux de savoir pour quelle raison le bus est modifié après cette ligne.


José

In reply to José Pedro Costa Coelho

Re: Week 8 tests segmentation fault

by Gabriel Fleischer -

J'ai exactement le même problème et je peux même le completer un peu.


J'ai remarqué que si je regardais la valeur du pointeur stocké dans bus[0] juste après INIT_RUN(), il était valide.

Par contre, ajouter exactement la même ligne juste après, et le pointeur a une valeur de 0xFFFFFFFF.

Ça me laisse perplexe.

In reply to Gabriel Fleischer

Re: Week 8 tests segmentation fault

by Jean-Cédric Chappelier -

avez-vous essayé d'utiliser les outils présentés en semaine 3 (https://progos.epfl.ch/projet/display.html?file=handouts/gdb.md) et 6 (https://progos.epfl.ch/projet/display.html?file=handouts/dbg-ptr.md) ?  Par exemple (dans l'ordre) :

  • flags du compilateur (exemple :
    CFLAGS += -std=c11 -Wall -pedantic -g -Wextra -Wfloat-equal -Wshadow  -Wpointer-arith -Wbad-function-cast -Wcast-align -Wwrite-strings -Wconversion -Wunreachable-code -Wcast-qual -W -Wformat=2 -Winit-self -Wuninitialized
    ; bon, peut être pas tous tout de suite en même temp ;-) ) ;
  • analyse statique ;
  • ASan ;
  • et si nécessaire le débogueur (mais c'est plus délicat dans le cas des tests unitaires ; voir https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=29434#p59113).
In reply to Jean-Cédric Chappelier

Re: Week 8 tests segmentation fault

by Gabriel Fleischer -

J'ai trouvé que le problème vient de la variable bus qui est initialisé à l'intérieur d'un do while et qui donc ne fait pas partie du scope dans le test en lui-même.

J'en viens à ma nouvelle question, pourquoi y a-t-il un do {} while(0) aux lignes 23 à 28 de la macro INIT_CPU dans le fichier unit-test-cpu-dispatch.h ?
À quoi sert-il ? 

In reply to Gabriel Fleischer

Re: Week 8 tests segmentation fault

by Jean-Cédric Chappelier -

Houlà !!
Désolé d'avoir sousestimé/mal compris ce thread.
C'est en effet une erreur de notre part.
Je viens de la corriger et patcher tous vos repos : https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=32096#p64934

Pour vous répondre :
ce pattern (do { ... } while(0)) dans les macros est utilisé pour 2 choses :

  1. justement localiser les définitions des variables qui y seraient faites ;
    (mais ici c'est évidemment c'est qu'il NE faut PAS faire (!!) vu que le bus est partagé par/délégué au CPU) ;
  2. [mineur] pour permettre une écriture de la macro similaire à une expression : la terminer par un point-virgule.
Cette erreur nous a échappé par manque de vigilance et aussi parce que sur nos machines nous n'avions pas le SEGV (mais la faute était bien là quand même !!).

Toutes nos excuses pour ce bug et la perte de temps qu'il a pu engendré.