2 votes

Définir plus de caractères que ceux déclarés sans aucun avertissement

Je l'ai reproduit avec un exemple simple :

#include <stdio.h>

int main(int argc, char **argv)
{
    char l1[16];

    sprintf(&l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");
    printf(l1);
    printf("\n");
    return 0;
}

Même si ma variable est déclarée comme ayant une longueur de 16 caractères, je peux y mettre beaucoup plus de caractères sans que le compilateur ne fasse d'erreur, et cela fonctionne même. Je m'attendais à ce que la chaîne de caractères soit coupée à 16 caractères, mais non. Pourquoi ? Et comment puis-je obtenir la chaîne coupée ?

1voto

ryyker Points 3662

Je peux y mettre beaucoup plus de caractères sans que le compilateur ne fasse d'erreur...

Votre code n'a enfreint aucune règle syntaxique (sauf dans l'exemple ci-dessous), le compilateur n'a donc aucune raison de se plaindre. Cependant ceci :

char l1[16];

    //sprintf(&l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");  // & is wrong  l1 is already a pointer
                                                         // and should have resulted in 
                                                         // incompatible pointer type warning.

    sprintf(l1, "%s", "Hello AKIT!!!!!!!!!!!!!!!!");  

...est comportement indéfini . Cela signifie que parfois votre programme semblera fonctionner, mais qu'à tout moment, il peut cesser de fonctionner. Tel qu'il est écrit, vous écrasez le tampon. Mais un programme C ne se plaindra qu'au moment de l'exécution, et seulement si la mémoire dans laquelle vous écrivez (et qui ne vous appartient pas) appartient à un autre processus. Dans ce cas, une erreur d'exécution se produira.

Les méthodes de prévention du problème de dépassement de tampon (autres qu'une programmation minutieuse) comprennent l'apprentissage et l'utilisation des éléments suivants snsprintf() . Il existe également un spécification du format de limitation de la longueur qui peut être utilisé avec sprintf() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X