scanf Cppcheck avertissement

Cppcheck affiche l'avertissement suivant pour scanf:

Message: scanf without field width limits can crash with huge input data. To fix this error message add a field width specifier:
    %s => %20s
    %i => %3i

Sample program that can crash:

#include 
int main()
{
    int a;
    scanf("%i", &a);
    return 0;
}

To make it crash:
perl -e 'print "5"x2100000' | ./a.out

Je ne peux pas écraser ce programme en tapant"entrée de données énorme". Qu'est-ce que je dois taper pour avoir cet accident? Je ne comprends pas non plus la signification de la dernière ligne de cet avertissement:

perl-E...

7
demandé sur Alok Save 2011-08-11 11:43:47

3 réponses

la dernière ligne est un exemple de commande à exécuter pour démontrer l'écrasement avec le programme échantillon. Il provoque essentiellement perl à imprimer 2.100.000 fois " 5 "et puis passer à la stdin du programme" A. out" (qui est censé être le programme d'échantillonnage compilé).

tout D'abord, scanf() devrait être utilisé pour les tests seulement, pas dans les programmes du monde réel en raison de plusieurs problèmes qu'il ne sera pas traiter avec élégance (par exemple, demander pour "%i" mais des entrées d'utilisateur "12345abc" (le "abc" sera rester dans stdin et peut faire remplir les entrées suivantes sans que l'utilisateur ait la chance de les changer).

à propos de cette question: scanf() saura qu'il devrait lire une valeur entière, mais il ne saura pas combien de temps il peut être. Le pointeur peut pointer vers un entier 16 bits, un entier 32 bits, ou un entier 64 bits ou quelque chose de plus grand encore (qu'il n'est pas conscient off). Les fonctions avec un nombre variable d'arguments (défini avec ... ) ne savent pas le type de données exact de les éléments passés, il doit donc s'appuyer sur la chaîne de format (raison pour laquelle les balises de format ne doivent pas être optionnelles comme dans C# où vous venez de les numéroter, par exemple "{0} {1} {2}" ). Et sans une longueur donnée il doit assumer une certaine longueur qui pourrait être dépendante de la plate-forme aussi bien (rendant la fonction encore plus Impropre à l'utilisation).

en général, le considèrent comme potentiellement dangereux et un point de départ pour les attaques de débordement de tampon. Si vous souhaitez sécuriser et optimiser votre programme, commencez par remplacer avec des solutions de rechange.

5
répondu Mario 2011-08-11 07:57:26

j'ai essayé d'exécuter l'expression perl contre le programme C et il s'est écrasé ici sur Linux (faute de segmentation).

0
répondu Kenji 2011-08-11 07:51:31

L'utilisation de la fonction' scanf ' (ou fscanf et sscanf) dans des applications réelles n'est généralement pas recommandée du tout parce que ce n'est pas sûr et c'est généralement un trou pour le dépassement de tampon si des données d'entrée incorrectes sont fournies. Il existe des moyens beaucoup plus sûrs de saisir des nombres dans de nombreuses bibliothèques couramment utilisées pour C++ (Qt, bibliothèques exécutables pour Microsoft Visual C++, etc.).). Vous pouvez probablement trouver des alternatives sûres pour le langage C " pur " aussi.

0
répondu Win32.Neshto 2011-08-11 07:52:41