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 :
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 *));
Je l'utilise de la manière suivante :
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);
Le code de la fonction ma_comparaison est le suivant :

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;
}
Quand je passe Cpptest, j'ai une erreur MISRA sur le qsort, en particulier pour la quatrième entrée :
"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 :
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);
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
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;
}
Pas spécialement convaincu, je change les static_cast en dynamic_cast.
Mes erreurs MISRA disparaissent pour laisser place à d'autres... absolument incompréhensibles à mes yeux :

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
 
  [...]
}
Comment peut-il dire que les paramètres et variables ne sont pas utilisés ???
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.