8
votes

Y a-t-il un moyen de faire avertir GCC ou CLIG sur des lancements explicites?

Ce que j'essaie de faire est de trouver toutes les moules explicites de type double ou float à tout autre type dans certains fichiers source que j'ai. Y a-t-il une façon de GCC intégrée de faire cela? La langue est C. Merci!


6 commentaires

Peut-être que je suis simplement simple, mais ne pouviez-vous pas simplement rechercher (double) ou (flotteur) dans votre source?


@RoberTharavey Désolé, je l'ai reproché pour avoir plus de sens. Je veux attraper toutes les moules explicites qui sont de type flotteur / double à autre chose, afin que je puisse rechercher (int), etc. Mais je ne pourrais pas dire si elles flottent ou doubles.


Juste une pensée (je ne sais pas C ++ ou si c'est même possible): remplacer l'opérateur de distribution pour doubler et flotter pour émettre une panne de compilation et compiler comme C ++ :)


@PMG qui semble intéressant, mais j'ai très peu de connaissances sur la façon de commencer à faire cela.


@ user1071861: J'ai demandé s'il est possible: Stackoverflow.com/Questtions/10320282/...


@PMG - ... et appris que ce n'est pas le cas.


5 Réponses :


2
votes

-wonversion avertir pour des conversions implicites susceptibles de modifier une valeur ( double sont de gros types) et -wno-signer-conversion désactiver Avertissements sur les conversions entre les entiers signés et non signés (il y aurait donc des avertissements moins inutiles). Sinon, je ne vois aucune alternative standard ...

Le pire cas, vous pouvez rechercher ces mots-clés directement dans vos fichiers source ...


2 commentaires

D'après ce que je comprends, les conversions explicites ne seront pas attrapées par -Wonversion, elles sont en fait un moyen de se débarrasser des avertissements. J'ai fait quelques tests et j'ai trouvé que cela était vrai aussi, alors j'ai besoin de trouver une autre façon de le faire.


Malheureusement, ils sont montrés (au moins étaient quand j'ai essayé quelques mois). J'avais activé -wonversion pour attraper des conversions accidentel et la quantité de bruit générée à partir de conversions explicites (et prévues) était insupportable.



0
votes

Eh bien, je pense qu'il n'y a pas de telle option. Après tout, un avertissement est émis par le compilateur afin de vous avertir des choses que vous auriez pu faire involontairement. Un casting explicite, cependant, est essentiellement un moyen de dire à votre compilateur "tais-toi, je sais ce que je fais".


3 commentaires

Il ne faut pas flotter ou doubler que je suis inquiet, ça vient de flotter et double à autre chose. J'ai créé une liste pour toutes les couts, mais j'ai besoin d'extraire les noms de variables de cette liste qui ne sont que des flotteurs ou des doubles, que je trouve très difficile à faire.


Quel type de casting est problématique ici? S'ils sont problématiques, pourquoi ont-ils fini par le code le premier endroit?


@CLI_HLT: Il existe un mauvais code, vous savez, ce qui doit être réparé au mieux :)



2
votes

Depuis que les moulages sont explicitement légaux et la bonne façon de procéder à des conversions étranges, il est fortement improbable que GCC contienne une option pour en avertir

à la place, en fonction de votre source, vous pourrez peut-être obtenir Loin de: P>

grep '([^()]*)[ ()]*\(your list of variable names\)' *


0 commentaires

10
votes

Si votre code C peut également être compilé en mode C ++, vous pouvez utiliser G ++ 'S -WOLD-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-STYLE-AVERTISSE Drapeau pour déclencher un avertissement sur toutes ces cases.

Vous pouvez déterminer si CLang a des avertissements qui déclencheront un modèle de codage particulier à l'aide de son interrupteur -weyTout (mais que cela n'est pas utile pour presque d'autres fins - Clang a désactivé -By-Avertissements par défaut qui déclenchent sur diverses formes de code légitime). Cependant, dans ce cas, Clang n'a pas d'avertissement qui déclenchent sur de telles coulées.


0 commentaires

2
votes

Alors que les compilateurs que je connais n'ont pas d'options pour cela, Gimpel's Flexelint peut faire ce que vous voulez:

$ cat tst.c
int main (void)
{
    int i = 0, j = 0;
    float f = 0.0;
    double d = 0.0;

    i = (int) f;
    j = (int) d;
    d = (double) f;
    f = (float) d;
    i = (int)j;
    j = (unsigned) i;
    return (int) j;
}

$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012

--- Module:   tst.c (C)
               _
    i = (int) f;
tst.c  7  Note 922: cast from float to int
               _
    j = (int) d;
tst.c  8  Note 922: cast from double to int
                  _
    d = (double) f;
tst.c  9  Note 922: cast from float to double
                 _
    f = (float) d;
tst.c  10  Note 922: cast from double to float

shell returned 4


0 commentaires