Quelles sont les conséquences de l'ignorance: avertissement: paramètre non utilisé

StackOverflow https://stackoverflow.com/questions/308277

  •  08-07-2019
  •  | 
  •  

Question

Je travaille sur un projet C ++ et j'ai remarqué un certain nombre d'avertissements concernant les paramètres inutilisés.

Quel pourrait être l'effet si ces avertissements étaient ignorés?

Était-ce utile?

La solution

La fonction avec un paramètre non utilisé peut avoir un vrai bogue dans les cas suivants:

  1. Il existe un paramètre sortie qui n'est ni attribué ni écrit, ce qui entraîne une valeur indéfinie pour l'appelant.

  2. L'un des paramètres est un pointeur de fonction de rappel, que vous devez appeler et oublier de le faire. Cela peut arriver s'il y a beaucoup de #ifdef dans la fonction.

  3. Vous déclarez une variable locale avec le même nom que celui qui ombrage un paramètre, puis vous utilisez la mauvaise valeur dans la fonction.

Ne pas utiliser une entrée peut être inoffensif, mais vous pouvez réduire le bruit pour afficher les avertissements utiles en marquant explicitement les paramètres d'entrée inutilisés au début de la fonction void (fonctionne à la fois en C et C ++):

(void)param1;

Ou,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

Ou omettez le nom du paramètre (C ++ uniquement):

void foo(int param1, int /*param2*/)
{
    bar(param1);
}

Autres conseils

Si vous avez un grand nombre d'avertissements sans importance qui ne sont pas importants pour vous, vous risquez de ne pas tenir compte de l'avertissement important concernant la ligne de code que vous venez d'écrire et qui se cache au milieu d'eux.

Pour un moyen spécifique à gcc de désactiver l'avertissement, vous pouvez utiliser __ attribut __ ((non utilisé)) comme

.
void foo(int a, int b __attribute__((unused))) {

}

Pour ignorer le deuxième paramètre. Si votre programme s'appuie déjà sur les technologies GCC, vous pouvez utiliser cet attribut pour être à 100% à l'abri de ce type d'avertissement.

Cela signifie que vous avez écrit une fonction qui prend un paramètre mais ne l'utilise pas. C'est inoffensif, mais cela peut indiquer des bugs dans certains cas.

En règle générale, vous pouvez désactiver cet avertissement en supprimant le nom du paramètre, mais en le laissant anonyme. Toutefois, cela peut ne pas être souhaitable, selon la raison pour laquelle le paramètre n'est pas utilisé.

Je vous suggérerais de désactiver l'avertissement s'il est difficile de trouver les véritables problèmes.

En C ++, vous pouvez avoir des arguments par défaut:

int sum(int first, int second=0){   // should not give warning
    return first+first;
}

Vous pouvez également avoir un argument supplémentaire:

int sum(int first, int second){     // should give warning
    first *= 2;
    return first;
}

Si vous avez un paramètre que vous n'utilisez pas et il n'est pas configuré par défaut, vous devriez recevoir un avertissement, car vous demandez au programme de transmettre à la pile des valeurs supplémentaires qui ne sont jamais référencées, et fait donc plus de travail qu'il ne le devrait.

Cela signifie peut-être aussi que vous avez oublié une partie de la logique de la fonction.

Aucun. sauf [EDIT]: comme d'autres l'ont fait remarquer, vous pourriez avoir un paramètre de sortie non affecté.

Vous devriez les nettoyer, car à de nombreuses reprises, j'ai vu des développeurs ignorer des avertissements importants "cachés" parmi un grand nombre d'avertissements, et ils étaient tellement habitués à les voir qu'ils n'y ont jamais prêté attention. J'essaie d'avoir zéro avertissements à tout moment et de définir les avertissements du compilateur au niveau maximal.

Cela dépend si vous avez l'intention d'utiliser le paramètre. Ex.

const int Size = 12; // intended for use in some other function

char* MakeBuffer(int size)
{
   return new char[Size];
}

Dans ce code, "taille" n'est pas utilisé et c'est la constante "Taille" qui est utilisée. L’avertissement mettra donc en évidence les problèmes de ce type pour vous.

Cependant, si vous n'utilisez jamais le paramètre avec indentation, il devrait simplement être supprimé de la signature de la méthode. Sauf si vous devez faire correspondre une signature pour une méthode virtuelle, ou un pointeur de fonction, si c'est le cas, vous ne pouvez pas le supprimer.

Si une méthode n'utilise pas de paramètre, la première question qui se pose est celle-ci: pourquoi ce paramètre fait-il partie de la signature de la méthode? Ces avertissements ont du sens car il est de mauvaise conception à ceux-ci de se référer à et plus loin, il y a aussi un peu de frais généraux que chaque fois que cette méthode est appelée, ce paramètre est poussé sur la pile, le mieux est donc de refactoriser la méthode et de la supprimer. de tels paramètres qui n'ont aucune utilité.

Cela dit, laisser ces paramètres ne nuit pas beaucoup, sauf à un peu de temps système que j'ai mentionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top