2010-12-12 65 views
0

je dois inclure une fonction C dans mon programme C++, lors de la compilation du code avec g ++ je reçois l'avertissement suivant:g ++ + strncat: risque de déborder le tampon de destination

In function ‘char* strncat(char*, const char*, size_t)’, 
    inlined from ‘int get_usage(pid_t, pstat*)’ at src/getusage.c:24: 
/usr/include/bits/string3.h:154: warning: call to 
char* __builtin___strncat_chk(char*, const char*, long unsigned int, 
long unsigned int) might overflow destination buffer 

code:

int pidof(const char* process_name){ 
char cmd[50] ="pidof "; 
strncat(cmd, process_name, sizeof(cmd) - strlen(cmd) -1); 
[..] 

Comment puis-je me débarrasser de cet avertissement?

+0

Bienvenue dans StackOverflow! S'il vous plaît regardez autour de la FAQ: http://stackoverflow.com/faq –

+0

ouh, erreur stupide :) J'ai mal lu l'erreur msg, l'erreur était sur une autre utilisation de strncat où j'ai seulement passé la taille du tampon comme paramètre de taille => fixe :) – fho

+0

Vous devriez utiliser std :: string. Ils sont plus faciles à utiliser. Ont construit en soutien à la concaténation et ils sont également plus sûrs à utiliser. – bruno

Répondre

1

Votre code est sûr (je pense), mais la fonction strncat() est seulement sûr à utiliser si vous connaissez la longueur:

  1. le tampon
  2. le matériau déjà dans le tampon

Si vous connaissez également la longueur du matériau à ajouter et qu'elle est plus courte que l'espace disponible, vous pouvez simplement utiliser memmove(); s'il est plus long, devriez-vous signaler que vous le tronquez? Si vous ne connaissez pas la longueur du matériel à ajouter, vous devriez peut-être le faire (ainsi vous pouvez signaler que vous tronquez quelque chose), mais si cela vous dérange, vous pouvez toujours utiliser memmove() et ajouter une valeur nulle à la fin de le tampon pour assurer une terminaison nulle.

1

D'un commentaire posté:

l'erreur était sur une autre strncat utilisation où je ne passais la taille de la mémoire tampon comme paramètre size => fixe

strlcat() présente une interface plus simple à le type de concaténation que vous effectuez - conçu pour empêcher exactement ce type d'erreur (en oubliant de tenir compte de la longueur de la chaîne déjà dans le tampon). Si votre chaîne d'outils ne l'a pas, la version OpenBSD a une licence assez libérale, et si vous ne pouvez pas l'incorporer pour quelque raison que ce soit, c'est une fonction assez simple à mettre en œuvre (assurez-vous de tester le conditions aux limites si vous suivez cette route). Pour ce faire une fois, et vous pouvez éviter les bugs causés par une mauvaise utilisation de strncat() pour toujours. Les types de bogues que vous pourriez rencontrer avec une mauvaise utilisation de strlcat() sont susceptibles d'être moins sévères (oublier de vérifier la troncature est généralement moins un problème que les dépassements de mémoire tampon).