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 : Analyse Statique du Code, MySQL, Static Code Analysis
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.
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.
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