Citation :
Peux-tu faire une passe sur tout le code afin de vérifier s'il y' a encore des bugs ?
J'ai relu gc.c, minilisp.c et repl.c, et j'ai trouvé six bugs, tous corrigés. Les 254 tests passent avec et sans GC forcé, et les 5 exemples tournent sans erreur sous ASan/UBSan. J'ai aussi lancé 1 200 programmes aléatoires, générés à partir des primitives, sous ASan avec GC forcé : aucun crash. Rien n'est commité.
Bugs corrigés
- print plantait (SEGV) sur une liste très imbriquée (1 000 000 de niveaux) ou qui se contient elle-même ((setcar x x)). Il y a maintenant l'erreur « Stack overflow », comme pour le lecteur.
- Le lecteur plantait sur une longue suite de ' (2 000 000 d'apostrophes). read_quote n'avait pas la vérification de pile que read_list et read_vector avaient.
- (eq "a" ()) donnait une erreur alors que (eq () "a" ) renvoyait (). Une chaîne n'est plus jamais eq à autre chose qu'une chaîne de même contenu, et eq ne lève plus d'erreur dans ce cas.
- -9223372036854775808 ne pouvait pas être lu (« Integer too large »). C'est corrigé ; -9223372036854775809 reste refusé.
- Une macro placée en tête de forme donnait « Bug: eval: Unknown tag type » : (defmacro c () (list a)) où a est une macro. Les macros s'évaluent maintenant comme les fonctions.
- alloc tronquait la taille d'un objet au-delà de 4 Go (taille stockée sur 32 bits). Cela n'arrive qu'avec -M supérieur à 4 Go ; il y a maintenant « Memory exhausted ».
|