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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 confirmé
    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 : 39
    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
    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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 confirmé
    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 : 39
    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
    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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 ???????????

  8. #8
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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é ??

  10. #10
    Expert confirmé
    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 : 39
    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
    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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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 confirmé
    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 : 39
    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
    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 Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    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 414
    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.

  15. #15
    Expert confirmé
    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 : 39
    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
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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..

  17. #17
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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

  18. #18
    Expert confirmé
    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 : 39
    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
    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 averti
    Inscrit en
    Novembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 27
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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...

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