IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Detection de cast utilisé en langage C dans du code C++


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Detection de cast utilisé en langage C dans du code C++
    Bonjour,

    Je voudrais savoir si il existe des outils ou même des options dans des compilateurs capables de détecter des cast utilisé en langage C dans du code C++.
    J'utilise un analyseur statique de code puissant mais il ne parvient pas à detecter ce genre de cast. Je joins le code suivant qui est archi-faux mais qui compile bien :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    #include <stdio.h>
     
    class TestA {
    public:
     
        virtual void Print ( void ) {
     
            printf("TestA [%08X].\n",this);
        }
     
        static void Test ( TestA* Class ) {
     
            if (Class)
                Class->Print();
            else
                printf("TestA : NULL passed.\n");
        }
    } ;
     
    class TestB {
    public:
     
        virtual void FunctionDummy ( void ) {
     
            printf("CRASH + CORE !!!! \n");
        }
     
        virtual void Test_CastC ( void ) {
            // This should show an error of invalid cast/ useless /dangerous
            // Devrait montrer une erreur de cast invalide / inutile / dangereux.
            // Normalement, crash ici.
            TestA::Test((TestA*)this);
        }
     
    /*  // Don't compile
        // Ne compile pas.
        virtual void Test_SCastCPP ( void ) {
     
            TestA::Test(static_cast<TestA*>(this));
        }
    */
     
        virtual void Test_DCastCPP ( void ) {
            // don't crash for an execution if the class TestA checks NULL values
            // Ne plante pas à l'exécution si la classe TestA vérifie les valeurs NULL.
            TestA::Test(dynamic_cast<TestA*>(this));
        }
    } ;
     
    int main(int argc, char* argv[]) {
     
        TestA A ;
        TestB B ;
        int i = 0 ;
     
        A.Print();
        A.Test(&A);
        A.Test(NULL);                  // Major crash in the execution => the dynamic_cast in TestA doesn't work (dead code) 
    //    A.Test((TestA*)(&i));     // Crash sévère à l'exécution => le dynamic_cast dans TestA ne sert à rien (code mort).
        B.Test_CastC();
    //    B.Test_SCastCPP();
        B.Test_DCastCPP();
     
    	return 0;
    }
    Si quelqu'un a une idée sur la question ?

    Merci

  2. #2
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Solution
    J'ai trouvé une option dans gcc, j'utilise la version 4.4.0. En activant l'option -Wold-style-cast pour un programme C++, il détecte l'utilisation de cast utilisé en langage C dans du code C++.
    J'utilise la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -c -x c++ -Wold-style-cast monfichier.cpp .
    Avec cette commande voici ce que j'obtiens:

    Code : Console


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    gcc -c -x c++ -Wold-style-cast Test_ClassCast.cpp
     
    Test_ClassCast.cpp: In member function 'virtual void TestB::Test_CastC()':
    Test_ClassCast.cpp:32: warning: use of old-style cast

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Je voudrais savoir si il existe des outils ou même des options dans des compilateurs capables de détecter des cast utilisé en langage C dans du code C++.
    Une reponse universelle a cette question (hors option du compilateur), c'est grep et/ou des regex
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Une reponse universelle a cette question (hors option du compilateur), c'est grep et/ou des regex
    Sûr, un pattern "parenthèse - identificateur - parenthèse" en C/C++, ça va remonter les casts C...

    Et quasiment tous les appels de fonction à un seul paramètre, les variables de macros, les arguments des "switch" ou "while" si ce sont des variables qui sont testées, etc...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Sauf que ces cast se font apres un signe =, une virgule ou une parenthese (jen oublie p-e, mais je pense pas). Et ca permet de limiter les faux positifs
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Sauf que ces cast se font apres un signe =, une virgule ou une parenthese (jen oublie p-e, mais je pense pas). Et ca permet de limiter les faux positifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (int)var = (var2) + (type_perso_num)var3
    Le premier cast n'est pas dans ce cas de figure.
    Le deuxième sera un faux positif.
    Le troisième ne sera pas détecté non plus.

    Bref, c'est loin d'être aussi simple qu'un test de regexp... Il faut quasiment arriver au niveau de la compilation (après analyse lexicale et une bonne partie d'analyse sémantique) pour tous les détecter, et c'est largement hors du cadre d'une "simple" regexp.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (int)var = (var2) + (type_perso_num)var3
    .
    A quoi peut bien servir le (int) devant var !?

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ben à le caster..
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Goten Voir le message
    Ben à le caster..
    Tout est dit...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    Mais ça marche pas si y a pas de lvalue à gauche du cast !?

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    T'as raison... pas pensé à sa.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Bref, c'est loin d'être aussi simple qu'un test de regexp... Il faut quasiment arriver au niveau de la compilation (après analyse lexicale et une bonne partie d'analyse sémantique) pour tous les détecter, et c'est largement hors du cadre d'une "simple" regexp.
    Dans ce cas, on lance boost::spirit / lex && yacc / whatever et on fait une analyse primaire du code source.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  13. #13
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Mais ça marche pas si y a pas de lvalue à gauche du cast !?
    Tu peux mettre des casts presque n'importe ou et n'importe comment, c'est bien ça le problème justement...

    Citation Envoyé par Davidbrcz Voir le message
    Dans ce cas, on lance boost::spirit / lex && yacc / whatever et on fait une analyse primaire du code source.
    Ce qui n'entre pas dans la catégorie "outils" (sûrement sous-entendu "tout prêts") ni dans la catégorie "options du compilateur"... Ni dans la catégorie "ligne de commande simple à taper". En l'occurence, c'est à peu près aussi long à mettre en place qu'un pseudo-compilateur ou une recherche manuelle avec filtrage des faux positifs. Donc, peu rentable si ça ne doit être exécuté qu'une seule fois.

    Faire un makefile spécial pour GCC avec éventuellement un filtre de la sortie me semble bien plus rapide et pratique à mettre en œuvre.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  14. #14
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Tu peux mettre des casts presque n'importe ou et n'importe comment, c'est bien ça le problème justement...
    oui mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (T)var = someExpression;
    Ca compilera pas car le cast d'une non-reference donne une rvalue. Donc ici le code voudrait dire : on crée un temporaire non nommée de type T a qui on affecte someExpression.
    C'est pourquoi c'est interdit d'ailleurs...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#][Geometry] mini langage path dans du code behind?
    Par bakonu dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 19/03/2012, 10h56
  2. utiliser le langage latex dans mon code java
    Par guim2708 dans le forum Général Java
    Réponses: 0
    Dernier message: 27/05/2009, 22h08
  3. [langage] Susbstitution dans un fichier
    Par GLDavid dans le forum Langage
    Réponses: 6
    Dernier message: 08/09/2003, 15h16
  4. Réponses: 9
    Dernier message: 22/03/2003, 21h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo