none
Différence d'exécution sprintf et sprintf_s RRS feed

  • Question

  • Bonjour à toutes et tous,

    j'ai une petite question concernant l'exécution des deux fonctions citées dans le titre.

    Prenons l'exemple de code suivant :

    char temp[200];
    char temp2[200];
    
    sprintf(temp, "%)");
    sprintf_s(temp2, 200,"%)");
    

    Faisons abstraction du fait que la chaine de formatage est stupide.

    L'exécution de la première ligne (sprintf) ignore le symbole '%' (car le format %) n'existe pas) et remplit temp avec ')'.

    La seconde ligne plante par contre lors de la lecture du format '%)'.

    Premièrement est-ce normal? Et deuxièmement, pourriez-vous m'expliquer pourquoi les deux fonctions ont un comportement différent?

    (où est la compatibilité de code si on passe de l'une à l'autre si les deux fonctions ne se comportent pas de la même manière).

     

    Merci d'avance pour votre temps et vos réponses.

    Thomas

    vendredi 17 septembre 2010 07:24

Réponses

  • sprintf_s a été conçu pour éviter, autant que possible, les problèmes de sécurité induits par la manipulation des chaînes de caractère.

    Les chaînes de formatage erronées sont des vecteurs classiques d'attaques, et encore plus classiques de bugs.

    Donc, oui, c'est normal. Les fonctions ont des comportements différents car leur code sont différents, il y a deux méthodes pour faire la même chose mais pas dans les mêmes conditions (sprintf, c'est chez les bisounours et les super-codeur ; sprintf_s, c'est dans le monde réel avec des coder humain).

    La compatibilité du code ? Ce qui était valide dans l'une est valide dans l'autre, c'est juste les entrés non valides qui ont un problème.


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse __Atari__ vendredi 17 septembre 2010 11:44
    vendredi 17 septembre 2010 09:26
    Modérateur
  • Bonjour,

     

    La version sprint_f implémente les fonctionnalités de sprintf et ajoute des vérifications de sécurité. Une description de cette fonction se trouve ici :

    http://msdn.microsoft.com/fr-fr/library/ce3zzk1k(v=VS.80).aspx

     

    La version sprintf_s plante parce-que les spécificateurs de format ne sont pas valides. La version sprint ne fait pas ces vérifications.

     

    Une autre vérification faite par la fonction sprintf_s est la longueur de la chaine de caractères. Si vous pouvez utiliser cette séquence de code avec sprintf

     

    char a[3];

    sprintf(a, "abcd");

    printf("%s", a);

     

    et vous aurez « abcd » affiché sur l’écran,

     

    vous ne pouvez pas le faire avec sprintf_s :

    char a[3];

    sprintf_s(b, 3, "abcd");

    printf("%s", a);

     

    et

     

    char a[3];

    sprintf_s(b, 4, "abcd");

    printf("%s", a);

     

    donnent des erreurs a l’execution.

     

    La compatibilité du code est un principe lié à la possibilité d’exécution de code sur des machines différentes sans modification. Ce principe n’a rien à faire avec des fonctions différentes qui implémentent des comportements semblables.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse __Atari__ vendredi 17 septembre 2010 11:45
    vendredi 17 septembre 2010 09:36

Toutes les réponses

  • sprintf_s a été conçu pour éviter, autant que possible, les problèmes de sécurité induits par la manipulation des chaînes de caractère.

    Les chaînes de formatage erronées sont des vecteurs classiques d'attaques, et encore plus classiques de bugs.

    Donc, oui, c'est normal. Les fonctions ont des comportements différents car leur code sont différents, il y a deux méthodes pour faire la même chose mais pas dans les mêmes conditions (sprintf, c'est chez les bisounours et les super-codeur ; sprintf_s, c'est dans le monde réel avec des coder humain).

    La compatibilité du code ? Ce qui était valide dans l'une est valide dans l'autre, c'est juste les entrés non valides qui ont un problème.


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse __Atari__ vendredi 17 septembre 2010 11:44
    vendredi 17 septembre 2010 09:26
    Modérateur
  • Bonjour,

     

    La version sprint_f implémente les fonctionnalités de sprintf et ajoute des vérifications de sécurité. Une description de cette fonction se trouve ici :

    http://msdn.microsoft.com/fr-fr/library/ce3zzk1k(v=VS.80).aspx

     

    La version sprintf_s plante parce-que les spécificateurs de format ne sont pas valides. La version sprint ne fait pas ces vérifications.

     

    Une autre vérification faite par la fonction sprintf_s est la longueur de la chaine de caractères. Si vous pouvez utiliser cette séquence de code avec sprintf

     

    char a[3];

    sprintf(a, "abcd");

    printf("%s", a);

     

    et vous aurez « abcd » affiché sur l’écran,

     

    vous ne pouvez pas le faire avec sprintf_s :

    char a[3];

    sprintf_s(b, 3, "abcd");

    printf("%s", a);

     

    et

     

    char a[3];

    sprintf_s(b, 4, "abcd");

    printf("%s", a);

     

    donnent des erreurs a l’execution.

     

    La compatibilité du code est un principe lié à la possibilité d’exécution de code sur des machines différentes sans modification. Ce principe n’a rien à faire avec des fonctions différentes qui implémentent des comportements semblables.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse __Atari__ vendredi 17 septembre 2010 11:45
    vendredi 17 septembre 2010 09:36
  • Merci pour vos réponses rapides et précises. Ma lanterne s'en trouve encore un peu plus éclairée ;)
    vendredi 17 septembre 2010 11:44