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.