Qualité du Code de Mysql … ou non qualité

2 décembre 2008 par Laurent Tardif

Ma marotte actuelle sont les outils d’analyse statique de code (ASC). J’ai essayé d’expliquer a mon DBA préféré comment faire de l’intégration continue avec une DB, et comment intégrer des outils d’ASC pour valider son travail.

Nous sommes partis de la dernière version de Mysql (5.1.29-rc…) que j’ai téléchargé sous forme de tarball sans m’embêter a lire la doc de bazaar :-p …..  J’ai intégré les quelques patches maison, les quelques modifications, et plugé ca dans Hudson pour avoir un retour rapide sur la qualité de mon build.

(Profitant des nombreux tests fournis avec le source.)

Plutôt content de moi, j’ai décidé de brancher plusieurs outils d’ASC (spécialisés dans la recherche de bugs, ou de code ‘risqué’). Je n’ai pas était déçu du tout du voyage ……

Plus de 2000 problèmes potentiels !!!!!!!!!

Alors, triés par modules cela donne a peu prêt :

client                      134
cmd-line-utils         80
core                      1034
libmysql                  211
mysys                       61
server-tools             34
storage/archive        38
storage/blackhole      1
storage/csv                9
storage/federated       5
storage/heap              8
storage/innobase   262
storage/myisam     147
storage/ndb           785

Juste pour illustrer les problèmes rencontrés regardons les (enfin, une petite partie des) problèmes liés a myisam:

  • storage/myisam/mi_check.c

Return code not check : everywhere the return code is checked, and an error is raised … my checker assume the return code is critical. So why at this line … no check ???

=> ligne 1185 :i_pack_get_block_info(info, &info->bit_buff, &block_info, &info->rec_buff, file, filepos)

  • storage/myisam/mi_key.c

NPE :
–> ligne 252 : char_length= (!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
//so assuming cs is null
–> ligne 268
FIX_LENGTH(cs, pos, length, char_length); //which dereference cs without any checks ….

  • storage/myisam/mi_rkey.c

Lock error :
—-> ligne 78 : rw_rdlock(&share->key_root_lock[inx]);  // take a lock
if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST))) use_key_length=USE_WHOLE_KEY;
……
if (rtree_find_first(info,inx,key_buff,use_key_length,nextflag) < 0)
//Allons donc dans le « then » … et bien la ressource n’est jamais libérée ….

  • storage/myisam/ha_myisam.cc

Fuite Memoire :
—> ligne 146
DBUG_ENTER(« table2myisam »);
if (!(my_multi_malloc(MYF(MY_WME, …..) ///// the allocation is not stored … and never free
DBUG_RETURN(HA_ERR_OUT_OF_MEM);

Alors, on peut bien sur, dire que certains problèmes n’arrivent que rarement, ou que c’est dans une partie du code peu appelée … Personnelement je pense qu’un BUG est un BUG …
Et les lois de Murphy m’ont apprises qu’un BUG vous embêtera toujours un vendredi soir … ou un week end.

Alors, ce n’est pas parcequ’il y a 2000 bugs potentiels qu’on peut dire que la release est de mauvaise qualité (lisez aussi (cela), … mais c’est un indice de plus, qu’a force de trop vouloir rajouter de nouvelles fonctionnalités, on oublie souvent l’essentiel, la stabilité et la robustesse du code.

(Vous pouvez trouver une autre version de l’article ici)

Mots-clefs : , ,

3 commentaires sur “Qualité du Code de Mysql … ou non qualité”

  1. PaT dit :

    Wow! Je ne connaissais pas ce genre d’outil. Ce que tu publies me fait peur. Monty a publié son opinion sur la qualité de la release (5.1 GA) et je crois que ce que tu démontres prouve son inquietude.

    Tu devrais envoyer tes résultats à l’équipe de MySQL. Accompagne ca d’un petit tuto sur comment utiliser les outils ASC! Leur équipe de Q.A. en a visiblement besoin.

  2. Cyril Scetbon dit :

    Ce qui serait intéressant c’est de reproduire le même test sur la 5.0 ce qui permettrait de savoir si ce sont des erreurs de code qui traînent depuis la 5.0 ou pas.

  3. Laurent dit :

    J’ai devancé ta question :) hier soir j’avais lance une analyse sur les versions 4.1 et 5.0 ….
    Les resultats sont visibles a :
    http://ouelcum.wordpress.com/2008/12/03/mysql-over-time/

    En gros : une grosse amelioration entre 4 et 5, par contre, ca ne fait que de se degrader depuis le debut de la 5 :-D

Laisser une réponse