Question

L'outil d'analyse statique que nous utilisons est en berne code C semblable au suivant comme un dépassement de mémoire tampon critique.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

Le message d'erreur de l'outil est: Buffer Overflow (Array Index Out of Bounds). Le tableau 'buf' la taille est 1. Tableau 'buf' peut utiliser l'indice 0..64

Est-ce légitime? La cession du tableau de caractères à la chaîne vide résultat vraiment sa longueur étant réduite à un seul octet, comme si elle était définie comme char buf [] = "";?

Était-ce utile?

La solution

Affectation « » à buf [size + 1] ne réinitialise pas la taille de buf, mais il est inutile, car il dédouble une petite partie de ce que la memset ultérieure fait (et il brouille votre outil d'analyse statique - vous pourriez veulent déposer un rapport de bogue contre).

Autres conseils

Mis à part le fait que l'omble buf [size + 1] ne compilera pas parce que la taille est une valeur d'exécution, en supposant que pourrait construire buf comme un tableau de taille 65, puis memset (buf, 0, 65) ne serait pas un débordement.

Les chances sont votre outil est confondu par vos questions syntaxiques.

[Edit: plus d'informations]

D'après les commentaires à mon message d'origine, je suggère ce qui suit:

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

Je crois que Rob Kennedy est correct; votre outil utilise la chaîne vide valeur initialiseur comme la taille du tableau plutôt que la déclaration de tableau statique.

Il est pas un dépassement de mémoire tampon.

Ceci est probablement un moyen plus propre de le faire. Certes, il faut moins de lignes de code.

#define size 64
char buf[size + 1] = {0};

Il est légal - la mémoire tampon est assez grand. L'outil vous avertit que size_t pourrait être plus grand que int et d'essayer de l'utiliser comme indexeur peut conduire à des résultats imprévisibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top