Bonjour,
J'ai pour mission de passer Cpptest (de Parasoft) sur un code (que je n'ai pas �crit) afin de v�rifier sa compatibilit� avec un certain nombre de r�gles MISRA.
Alors, soit le module Cpptest n'est pas au moins, soit un truc m'�chappe mais j'ai l'impression de tourner en rond.
J'utilise une fonction qsort personnalis�e � laquelle je ne peux toucher (et il n'est pas question de ne pas appeler cette fonction). Cette fonction a pour prototype :
Je l'utilise de la mani�re suivante :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 void mon_qsort (void *tableau, size_t nb_elem, size_t taille_elem, mon_int (*compare) (const void *, const void *));
Le code de la fonction ma_comparaison est le suivant :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 mon_qsort((void *)mon_tableau, (size_t) nombre_elements, (size_t) taille_elem, (mon_int (*) (const void *, const void *))ma_comparaison);
Quand je passe Cpptest, j'ai une erreur MISRA sur le qsort, en particulier pour la quatri�me entr�e :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 mon_int ma_comparaison(const ma_structure * const i_pa, const ma_structure * const i_pb) { mon_int resultat; if (i_pa->valeur > i_pb->valeur) { resultat = -1; } else if (i_pa->valeur < i_pb->valeur) { resultat = 1; } else { resultat = 0; } return resultat; }
"MISRA2008-5_2_6 : Do not convert a pointer to function 'ma_comparaison' to any other pointer type".
Qu'� cela ne tienne, je d�cide de faire quelques petits changement. L'appel � mon_qsort devient :
et ma fonction de comparaison est modifi�e de la fa�on suivante. Si je n'ai plus d'erreur MISRA sur le qsort, j'en ai dans mon code maintenant (que je mets en commentaires) :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 mon_qsort (void *)mon_tableau, (size_t) nombre_elements, (size_t) taille_elem, ma_comparaison);
Pas sp�cialement convaincu, je change les static_cast en dynamic_cast.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 mon_int ma_comparaison(const void * const i_pa, const void * const i_pb) { mon_int resultat; const ma_structure * const pa = static_cast<const ma_structure *>(i_pa); //MISRA2008-5_2_8 : do not convert pointer to void type to an object pointer type 'const mon_namespace::ma_structure *' const ma_structure * const pb = static_cast<const ma_structure *>(i_pb); //MISRA2008-5_2_8 : do not convert pointer to void type to an object pointer type 'const mon_namespace::ma_structure *' if (pa->valeur > pb->valeur) { resultat = -1; } else if (pa->valeur < pb->valeur) { resultat = 1; } else { resultat = 0; } return resultat; }
Mes erreurs MISRA disparaissent pour laisser place � d'autres... absolument incompr�hensibles � mes yeux :
Comment peut-il dire que les param�tres et variables ne sont pas utilis�s ???
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 mon_int ma_comparaison(const void * const i_pa, // MISRA2008-0_1_11 : Parameter 'i_pa' is not used. const void * const i_pb) // MISRA2008-0_1_11 : Parameter 'i_pb' is not used. { mon_int resultat; const ma_structure * const pa = dynamic_cast<const ma_structure *>(i_pa); //MISRA2008-01_3_a : Local variable 'pa' declared but not used //MISRA2008-01_3_b : Local variable 'pa' declared but not used const ma_structure * const pb = dynamic_cast<const ma_structure *>(i_pb); //MISRA2008-01_3_a : Local variable 'pb' declared but not used //MISRA2008-01_3_b : Local variable 'pb' declared but not used [...] }
Cpptest est-il fiable, comme outil.
Y a-t-il un moyen de faire autrement en gardant l'esprit du code ?
Merci d'avance pour votre aide.
Partager