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

Bibliothèque standard C Discussion :

la fonction memmove_s de string.h


Sujet :

Bibliothèque standard C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut la fonction memmove_s de string.h
    Bonjour,

    J'aimerai savoir si la fonction memmove_s est utilisée par l'un d'entre vous et si c'est le cas en utilisant quel compilateur?? (j'ai regardé dans gcc il n'y est pas)

    Merci

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ces fonctions (strcpy_s, sprintf_s) sont des extensions Microsoft à la librairie standard du C. Ce sont des améliorations, en termes de sécurité au niveau du code, des fonctions standards strcpy, sprintf, ... qui ne permettent pas par exemple de spécifier la taille du buffer qui va recevoir les données. Personnellement, j'utilise ces fonctions mais pas dans des programmes Open Source .

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Oui c'est bien ce que j'ai remarqué par contre j'aimerai l'utiliser pour linux (en open source donc) mais elle n'apparaît pas dans les librairies standards du C

    Citation Envoyé par Melem Voir le message
    Ces fonctions (strcpy_s, sprintf_s) sont des extensions Microsoft à la librairie standard du C. Ce sont des améliorations, en termes de sécurité au niveau du code, des fonctions standards strcpy, sprintf, ... qui ne permettent pas par exemple de spécifier la taille du buffer qui va recevoir les données. Personnellement, j'utilise ces fonctions mais pas dans des programmes Open Source .

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Les fonctions de la librairie standard permettent d'écrire des programmes solides, si on sait bien se servir d'elles. Par exemple, utiliser _snprintf (C99) au lieu de sprintf, strncpy au lieu de strcpy, etc. Au pire, implémenter ses propres fonctions.

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Oui je suis bien d'accord avec toi, par contre il existe desfonctions pour lesquels il existe toujours une problématique , la fonction que je recherche par exemple, memmove( ) comment tu veux la sécuriser sans réécrire le code source de memmove_s?? l'accès à la mémoire sous C est toujours problématique...

    Citation Envoyé par Melem Voir le message
    Les fonctions de la librairie standard permettent d'écrire des programmes solides, si on sait bien se servir d'elles. Par exemple, utiliser _snprintf (C99) au lieu de sprintf, strncpy au lieu de strcpy, etc. Au pire, implémenter ses propres fonctions.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Oui je suis bien d'accord avec toi, par contre il existe desfonctions pour lesquels il existe toujours une problématique , la fonction que je recherche par exemple, memmove( ) comment tu veux la sécuriser sans réécrire le code source de memmove_s?? l'accès à la mémoire sous C est toujours problématique...
    Une version sécurisée de memmove(), c'est pas non plus la mer à boire à implanter...

    Citation Envoyé par Melem Voir le message
    Les fonctions de la librairie standard permettent d'écrire des programmes solides, si on sait bien se servir d'elles. Par exemple, utiliser _snprintf (C99) au lieu de sprintf, strncpy au lieu de strcpy, etc. Au pire, implémenter ses propres fonctions.
    C99 parle de snprintf() et non de _snprintf(), non?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Oui je suis bien d'accord avec toi, par contre il existe desfonctions pour lesquels il existe toujours une problématique , la fonction que je recherche par exemple, memmove( ) comment tu veux la sécuriser sans réécrire le code source de memmove_s?? l'accès à la mémoire sous C est toujours problématique...
    en quoi elle te pose problème cette fonction ???????????
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Bentout simplement c'est qu'elle n'est pas reconnu par mon compilateur (je parle là de GCC 4.2.2) vu que le header string.h ne l'implémente pas encore pour le langage C...

    Citation Envoyé par souviron34 Voir le message
    en quoi elle te pose problème cette fonction ???????????

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je parlais de memmove..

    standard etc...

    En quoi elle te pose problème au niveau sécurité ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Thierry Chappuis
    C99 parle de snprintf() et non de _snprintf(), non?
    c'est ça.

    Citation Envoyé par souviron34
    je parlais de memmove..

    standard etc...

    En quoi elle te pose problème au niveau sécurité ??
    Parce qu'elle n'offre aucun moyen de spécifier la taille du buffer de destination.

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Les fonctions utilisant la mémoire sous C ont toutes été déprécies en faveur des fonctions xxx_s pour empêcher les buffer overflow. Un buffer Overflow permet à un malatentioné de prendre le contrôle de la machine en passant par des droits root..et il y a beaucoup d'exemples sur le net qui expliquent ce genre d'attaque

    Citation Envoyé par souviron34 Voir le message
    je parlais de memmove..

    standard etc...

    En quoi elle te pose problème au niveau sécurité ??

  12. #12
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Melem Voir le message
    c'est ça.

    Parce qu'elle n'offre aucun moyen de spécifier la taille du buffer de destination.
    Voilà! Taille de buffer de destination non spécifié == Buffer Overflow

  13. #13
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Bentout simplement c'est qu'elle n'est pas reconnu par mon compilateur (je parle là de GCC 4.2.2) vu que le header string.h ne l'implémente pas encore pour le langage C...
    Tout d'abord, il n'y a pas d'implémentation de fonction dans un fichier .h. Un fichier d'en-tête ne contient que des déclarations de fonctions, des définitions de types, de macros, etc. L'implémentation c'est dans les fichiers .c. Ensuite, comme je l'ai déja dit plus haut ces fonctions sont des extensions de Microsoft à la librairie du C, elles ne sont pas tenues à être connues de tous les compilateurs. Et enfin, si tu veux des fonctions "sécurisées" tu n'as qu'à implémenter les tiennes. Mais jusqu'où va cette sécurité en fait? Si le programme est bien écrit, il n'y a pas vraiment de différence à utiliser memcpy ou memcpy_s ...

  14. #14
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Voilà! Taille de buffer de destination non spécifié == Buffer Overflow
    Parle-t-on de la même fonction?
    #include <string.h>

    void *memmove (void *dest, const void *src, size_t n);

    DESCRIPTION
    La fonction memmove() copie n octets de la zone de mémoire src vers la zone dest. Les deux zones peuvent se chevaucher.
    Il est clair que si on lui balance n'importe quoi comme paramètres, on aura des petits soucis.
    Bien le bonjour chez vous
    Jowo

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Les fonctions utilisant la mémoire sous C ont toutes été déprécies en faveur des fonctions xxx_s pour empêcher les buffer overflow. Un buffer Overflow permet à un malatentioné de prendre le contrôle de la machine en passant par des droits root..et il y a beaucoup d'exemples sur le net qui expliquent ce genre d'attaque
    Le risque du buffer overflow face à un utilisateur mal intentionné se situe au niveau des entrées, pas dans les entrailles du programme. Dans un programme bien conçu il n'y a aucun risque d'un tel danger même en utilisant strcpy ou memcpy etc.

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut


    et quand tu fais un strcpy , strcat, ou n'importe quelle fonction ???

    En C en général il faut savoir ce qu'on fait...

    Comme dirait Emmanuel, c'est pas pour les frileux...


    Si tu fais une copie ou un mouvement mémoire sans savoir dans quoi tu le places, too bad...

    Les fonctions de la bibliothèque sont génériques, utilisées partout..

    Libre à toi de refaire ce que tu veux, mais je trouve particulièrement ... de vouloir remplacer des fonctions standards.. plutôt que de bien les utiliser..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kakibend Voir le message
    Les fonctions utilisant la mémoire sous C ont toutes été déprécies en faveur des fonctions xxx_s pour empêcher les buffer overflow. Un buffer Overflow permet à un malatentioné de prendre le contrôle de la machine en passant par des droits root..et il y a beaucoup d'exemples sur le net qui expliquent ce genre d'attaque
    mdrrrr

    j'aimerais bien :

    • Primo que tu me montres un lien disant que ces fonctions sont "dépréciées"
    • Secondo - à part pour M$, et c'est dû à son système de sécurité lâche, et non à l'utilisation de telle ou telle fonction de bibliothèques standards de langages standards - un exemple de prise de contrôle d'une machine par un memmove
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par jowo Voir le message
    #include <string.h>

    void *memmove (void *dest, const void *src, size_t n);

    DESCRIPTION
    La fonction memmove() copie n octets de la zone de mémoire src vers la zone dest. Les deux zones peuvent se chevaucher.
    Il est clair que si on lui balance n'importe quoi comme paramètres, on aura des petits soucis.
    Bien dit. Et pareil pour les fonctions xxx_s.

  19. #19
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Totalement d'accord avec toi mais il ne faut pas nier quand même qu'il existe des fonctions "plus sécurisée" qu'est-ce qui empêche de les utiliser dans ce cas si ces fonctions sont normalisées??
    Citation Envoyé par souviron34 Voir le message


    et quand tu fais un strcpy , strcat, ou n'importe quelle fonction ???

    En C en général il faut savoir ce qu'on fait...

    Comme dirait Emmanuel, c'est pas pour les frileux...


    Si tu fais une copie ou un mouvement mémoire sans savoir dans quoi tu le places, too bad...

    Les fonctions de la bibliothèque sont génériques, utilisées partout..

    Libre à toi de refaire ce que tu veux, mais je trouve particulièrement ... de vouloir remplacer des fonctions standards.. plutôt que de bien les utiliser..

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Melem Voir le message
    c'est ça.

    Parce qu'elle n'offre aucun moyen de spécifier la taille du buffer de destination.
    Ah bon ? Et le paramètre taille il sert à quoi ? A la déco de Noël ? Evidemment, il ne faut pas passer n'importe quoi comme paramètre...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 30
    Dernier message: 27/03/2008, 15h02
  2. Appel fonction via un string
    Par Veovis dans le forum C++
    Réponses: 17
    Dernier message: 06/02/2007, 09h45
  3. Fonction renvoyant une string
    Par salseropom dans le forum C
    Réponses: 8
    Dernier message: 04/05/2006, 11h44
  4. fonction manipulant une string
    Par salseropom dans le forum C
    Réponses: 16
    Dernier message: 21/02/2006, 13h18
  5. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 13h25

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