7
votes

Comment contourner l'avertissement de la GCC, "L'adresse de xxx ne sera jamais nulle"?

Je travaille sur un programme C. Il existe une fonction qui prend deux arguments de pointeur, appelez-le cmP () code>. Je présente ici un stand-in simplifié pour CMP () code> pour des raisons illustratives: xxx pré>

Je voudrais faire une macro chèque null, comme ceci:

int baz(struct foo *a)
{
   struct foo b;
   /* ... */
   return SAFE_CMP(a, &b); 
}


2 commentaires

Vous pouvez probablement utiliser l'un des pragmas de GCC pour désactiver cet avertissement pour la partie chèque null de la macro, puis la réactive.


Je ne vois pas ce que cela vous achète. Pourquoi la fonction CMP () est-elle simplement de faire ces chèques?


4 Réponses :


13
votes

Cela semble supprimer l'avertissement pour moi: xxx

... mais personnellement, je créerais simplement Safe_CMP () comme une fonction elle-même. xxx


3 commentaires

CMP () dans ma source de travail réelle est macro aussi. Je pense qu'il vaut mieux écrire dans la fonction en ligne. Milles mercis[


Je voterais cet article plus d'une fois si je pouvais! Cet avertissement m'a provoqué des maux de tête et le truc (vide *) moulée peut simplement sauver la journée.


Incidemment, on dirait que vous pouvez également taper à d'autres types de pointeur pour supprimer l'avertissement.



2
votes

"Je voudrais avoir une macro d'assistance appricitable à toute situation. " p>

pourquoi? Une taille unique ne convient pas à tous. GCC vous fait une faveur en vous disant qu'une comparaison sera toujours em> un certain résultat. L'adresse d'une variable de pile sera jamais em> être null. Je voudrais simplement écrire le chèque de Baz: p> xxx pré>

Vous pouvez également le faire dans CMP code>. Cela dépend de la manière dont vous définissez la prépréation et les post-conditions. P>

Un autre problème possible avec votre macro (non applicable pour Baz) est que a code> et B code> sera évalué plusieurs fois. Méfiez-vous de: P>

SAFE_CMP(p++, p1++);


1 commentaires

Je pense que c'est une question de goût. J'avais personnellement favoriser l'approche tout-en-une. Je serai heureux si GCC vérifie null chaque fois que je passe deux valeur dynamique du pointeur. Cependant, lorsque je passe une valeur de pointeur statique à l'aide de cette macro, je souhaite que GCC ne pas vérifier et produire un avertissement aussi gênant. Il est évident que "Retour Safe_CMP (A, & B);" est plus clair et lisible que "renvoyer A == null? 0: CMP (A, & B);" Quoi qu'il en soit, merci pour votre bonne réponse. Merci.



0
votes

L'option GCC -wno-adresse semble supprimer les avertissements.


0 commentaires

-1
votes

Lorsque vous avez un tel avertissement, envisagez la possibilité que vous ayez la double et&&& erreur dans votre expression if ()


0 commentaires