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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre � l'essai
    Inscrit en
    Juillet 2009
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    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
    Membre � l'essai
    Inscrit en
    Juillet 2009
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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

+ 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