Avertir si un autre nom typedef’d d’un type est utilisé dans une liste d’arguments

Considérons un grand projet, où de nombreux types sont typedef ‘d, par exemple

 typedef int age; typedef int height; 

et certaines fonctions obtenant des arguments de ces types:

 void printPerson(age a, height h) { printf("Age %d, Height %d\n", a, h); } 

Existe-t-il un moyen de prévenir au moment de la compilation si ces arguments sont du type incorrect, par exemple

 age a = 30; height h = 180; printPerson(h, a); /* No warning, because a and h are both integers */ 

Est-ce que gcc (ou un outil d’parsing de code statique) a une option pour avertir dans de tels cas?

Il n’y a pas de support intégré pour cela dans GCC.

Il y a une demande de fonctionnalité à append, basée sur l’atsortingbut Sparse nocast . Cependant, cela n’a pas été mis en œuvre. Si vous pouvez utiliser Sparse, vous pouvez le faire en marquant chaque __atsortingbute__((nocast)) avec __atsortingbute__((nocast)) .

En C ++, vous pouvez le faire en créant des classes wrapper plutôt que des typedefs, puis en ne définissant tout simplement pas de conversions implicites pour elles.

Klocwork a quelques vérifications liées à ce qu’ils appellent le “typage fort”.

Pour votre code, il renvoie STRONG.TYPE.ASSIGN.ARG car les types d’argument ne correspondent pas.

Il se plaint également d’affecter des valeurs int (les consts) à des variables de type age et height et d’utiliser les variables comme int dans printf .

J’ai entendu dire que c’est assez cher, cependant.

Comme cela a été clairement expliqué par les autres réponses, vous ne l’obtiendrez pas gratuitement avec gcc. Vous êtes certainement dans le monde des outils d’parsing statique pour résoudre ce problème.

Plusieurs suggestions ont été suggérées, certaines nécessitant une annotation supplémentaire, d’autres non, mais peuvent être plus que ce que vous recherchez. J’ai donc pensé en jeter un de plus dans le mélange …

Les différents outils de protection contre les peluches en ligne de commande ont constitué une longue attente pour moi. Dans votre cas, je pense que PC-lint / flexelint va très bien même s’il s’agit d’un outil commercial. Voir ici pour sa vérification de type forte.

Non, il ne peut pas y en avoir. Un compilateur vous avertira si vous faites (ou êtes sur le sharepoint faire) quelque chose d’ illégal . Il n’est pas censé connaître (ou déterminer l’exactitude) les valeurs que vous passerez comme paramètre de fonction. Tant que les types sont les mêmes, il n’ya aucune raison de se plaindre.

Cependant, en cas de non concordance de type , il vous alertera.

Une erreur sera générée uniquement lorsque les types sont différents. pouvez-vous envelopper ces types dans struct et utiliser des macros pour automatiser la définition et l’affectation.

Si vous souhaitez utiliser enum au lieu d’entiers, vous disposez d’une option pour les avertissements relatifs à l’utilisation d’énums mixtes dans l’outil d’parsing de code statique nommé coverity.

https://wiki.ubuntu.com/CoverityCheckerDictionary recherche MIXED_ENUMS.

Comme d’autres l’ont déjà indiqué, cela n’est pas supporté en C. Si vous voulez absolument que la vérification de type fort se produise, vous pouvez procéder comme suit:

 typedef struct {int a;} age; typedef struct {int h;} height; void printPerson(age a, height h) { printf("Age %d, height %d\n", aa, hh); } age a = {30}; height h = {180}; printPerson(h, a); // will generate errors 

Attention, cela pourrait toutefois avoir un impact sur les performances.