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 :

[C] Méthodes détection buffer overflow/overrun


Sujet :

C

  1. #21
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je suis la conversation d'un peu loin et je me dis que j'allais tester ce que donne ton code dans Dr Memory. J'ai rajouté un free() pour ne laisser que l'erreur d'accès hors des bornes de la zone malloqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
        int*a = (int*)malloc(10*sizeof(int));
        a[10] = 50; // overflow
        free(a);
    }
    J'obtiens comme rapport d'erreurs :
    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
    Dr. Memory version 1.5.1 build 6 built on Feb 25 2013 00:45:31
    Application cmdline: ""D:\Users\pgradot\Documents\C\main.exe""
    Recorded 75 suppression(s) from default C:\Program Files (x86)\Dr. Memory\bin\suppress-default.txt
     
    Error #1: UNADDRESSABLE ACCESS: writing 0x003b0f80-0x003b0f84 4 byte(s)
    # 0 main    
    Note: @0:00:00.251 in thread 4644
    Note: next higher malloc: 0x003b1938-0x003b1b58
    Note: refers to 1 byte(s) beyond last valid byte in prior malloc
    Note: prev lower malloc:  0x003b0f58-0x003b0f80
    Note: instruction: mov    $0x00000032 -> (%eax)
     
    DUPLICATE ERROR COUNTS:
     
    SUPPRESSIONS USED:
     
    ERRORS FOUND:
          1 unique,     1 total unaddressable access(es)
          0 unique,     0 total uninitialized access(es)
          0 unique,     0 total invalid heap argument(s)
          0 unique,     0 total GDI usage error(s)
          0 unique,     0 total warning(s)
          0 unique,     0 total,      0 byte(s) of leak(s)
          0 unique,     0 total,      0 byte(s) of possible leak(s)
    ERRORS IGNORED:
         60 still-reachable allocation(s)
             (re-run with "-show_reachable" for details)
    Details: d:\Users\pgradot\AppData\Roaming\Dr. Memory\DrMemory-main.exe.3224.000\results.txt
    En revanche, il n'est pas plus capable que valgrind de détecter l'erreur si on accède hors des bornes d'un vrai tableau...

  2. #22
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Bin il te faut rien de plus que free, malloc et ralloc pour monter tout ca et quelques conditions logique bien entendu mais si tu n'as pas le droit de procéder de la sorte soit
    Le problème c'est que dans ton exemple, tu as définie des fonctions d'ajouts et de suppressions d'un entier évitant ainsi l'utilisation de l'opérateur []. Donc tu peux tout contrôler dont les overflows/underflows si on utilise tes fonctions

    Dans mon cas, n'ayant pas accès au code source (en fait c'est faux, j'y ai accès mais je ne dois pas le modifier), je n'ai accès qu'aux surcharges des fonctions d'alloc mais je ne peux pas overloader l'opérateur [] en C ...

    Et puis le prototype de malloc est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* malloc(size_t size)
    Si par exemple, j'ai 40 dans size, aucun moyen de savoir si il veut 10 entiers, 40 caractères ou une structure complexe de 40 octets.

    Ou alors j'ai pas compris ton idée

    @Bktero: Oui je sais que Dr Memory sait détecter ce genre d'erreur, d'ailleurs je me demande bien comment il fait ^^ D'ailleurs ca veut dire quoi" 60 still-reachable allocation(s)" ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #23
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je viens de tester à l'instant un outil découvert il y a peu, cppcheck.

    Comme répertoire de travail, je lui ai donné mon dossier avec mes bouts de code tests C, notamment ceux pour Developpez. Il m'a détecté une erreur sur le code (alors que je ne cherchais pas du tout à le tester sur ce problème là, c'est une découverte due au hasard ^^) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void with_array(void)
    {
        int a[10] = {0};
        a[10] = 50; // overflow
    }
    Il y arrive aussi sur ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void more_subttle(void)
    {
        int a[10] = {0};
        for(int i=0; i < 11; i++)
        {
            a[i]= i;
        }
    }
    Je crois que je vais bien aimer cet outil !

  4. #24
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En effet, c'est bon à prendre.

  5. #25
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Le "60 still reachables" signifie que tu as fait 60 mallocs et que tu ne les a pas free !
    Pour les connaitre, tu devrais compiler avec les habituels flags de debug : -g -g3 -ggdb, puis lancer DrMemory sur le binaire résultat !
    Ca t'affichera le fichier et la ligne exacte où il y a un malloc non free.
    Par contre, pour corriger cela... il faut bien regarder dans toute la chaine fonctions laquelle demande à allouer et ne libère pas !

    (Ce qui serait intéressant à vérifier maintenant, c'est si les allocations mémoires windoziennes sont "aussi" vérifiées (en pur C/Windows) par DrMemory)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #26
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Non, l'"erreur" n'est pas liée à cela...... car le free() est bien présent ! Et aussi parce que 4 bytes par int * 10 int = 40 bytes donc 60 ne collent pas ^^

    De plus, si je commente le free() et repasse le binaire dans drmemory, j'obtiens vraiment une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error #2: LEAK 40 direct bytes 0x00660f58-0x00660f80 + 0 indirect bytes
    # 0 main
    Les still reachables semblent être des erreurs non graves, voir par exemple cette discussion de Stackoverflow.
    EDIT : ou le point 1 de la doc de drmemory.

    En ré-exécutant avec l'option indiquée, cela semble venir de dll. Extrait :
    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
     
    REACHABLE LEAK 206 direct bytes 0x004a5f48-0x004a6016 + 0 indirect bytes
     
    REACHABLE LEAK 2748 direct bytes 0x004a6230-0x004a6cec + 0 indirect bytes
     
    REACHABLE LEAK 1152 direct bytes 0x006b09f0-0x006b0e70 + 0 indirect bytes
     
    REACHABLE LEAK 544 direct bytes 0x006b1938-0x006b1b58 + 0 indirect bytes
     
    REACHABLE LEAK 2897 direct bytes 0x006b1b60-0x006b26b1 + 0 indirect bytes
     
    REACHABLE LEAK 8 direct bytes 0x006b2f90-0x006b2f98 + 0 indirect bytes
    # 0 msvcrt.dll!_calloc_crt
    # 1 msvcrt.dll!_cwild    
    # 2 msvcrt.dll!__getmainargs
    # 3 __mingw_CRTStartup
    # 4 ntdll.dll!RtlInitializeExceptionChain    +0x62     (0x777e9ef2 <ntdll.dll+0x39ef2>)
    # 5 ntdll.dll!RtlInitializeExceptionChain    +0x35     (0x777e9ec5 <ntdll.dll+0x39ec5>)

  7. #27
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Avec une DLL....
    Je me souviens qu'à une époque on soupçonnait printf de faire 1 leak, mais en y repensant, cela doit faire partie des "still reachable" en effet.
    Ca doit être une soixantaine de pointeurs encore référencés quelque part dans des globales.

    EDIT : Bon bah le post suivant a l'air d'appuyer cette idée
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #28
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il me semble avoir lu que sous linux, il reste des unreachables avec certaines parties de la glibc.
    Ce serait lié à des globales non déchargées (parce que la glibc reste utilisée partout)
    Il était dit que ces unreachables n'augmentent pas, et ne devrait(?) pas poser de problèmes.

    Cela dit, vérifie quand même ton code, mieux vaut être sûr.

  9. #29
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Oui, les outils comme valgrind ne peuvent (ne pourront jamais ?) pas ne pas donner de faux positifs. Certains sont référencés et cachés et dans la grande majorité des cas sont totalement inoffensifs (du moins ce sont les tous derniers à considérer lorsqu'on a un problème mémoire ...).
    Certaines bibliothèques comme le GLib offrent la possibilité de modifier leur comportement via des variables d'environnement pour être une peu plus valgrind friendly. Je ne sais pas ce qu'il en est sur la plateforme win32/win64 ...

  10. #30
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    D'accord, pour l'explication du still-reachable. en gros c'est pas (très) grave.

    CppCheck, ca à l'air pas mal comme outil, j'espère qu'il est compatible MinGW sous windows

    Je regarderais ca ce soir quand j'aurais un peu de temps.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #31
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    CppCheck, ca à l'air pas mal comme outil, j'espère qu'il est compatible MinGW sous windows
    Je suis sous Windows et utilise Codeblocks avec MinGW

  12. #32
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je suis sous Windows et utilise Codeblocks avec MinGW
    Il parait qu'avec CodeBlock, le plugin cppcheck est natif, pourtant je le trouve pas (faut dire que je suis encore à la version 8.02, c'est peut être pour ca )
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #33
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai aussi lu ça sur le site de cppcheck après mon précédent message. J'ai une version récente de Codeblocks et il y est

  14. #34
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Bktero Voir le message
    J'ai aussi lu ça sur le site de cppcheck après mon précédent message. J'ai une version récente de Codeblocks et il y est
    C'est pas très grave, j'installerais le plugin manuellement
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Se protéger contre les buffers overflows
    Par pharaonline dans le forum C
    Réponses: 2
    Dernier message: 11/06/2006, 22h25
  2. Buffer overflow ?
    Par Albator5151 dans le forum Général Java
    Réponses: 6
    Dernier message: 08/02/2006, 01h23
  3. [oracle 9i] ORU-10027: buffer overflow
    Par jejam dans le forum Oracle
    Réponses: 7
    Dernier message: 01/09/2005, 13h05
  4. Erreur ORU-10027 : buffer overflow
    Par valerie90 dans le forum Oracle
    Réponses: 3
    Dernier message: 14/02/2005, 08h40
  5. [Erreur] buffer overflow
    Par cmoulin dans le forum Administration
    Réponses: 8
    Dernier message: 04/08/2004, 14h36

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