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