2010-12-12 12 views
0

Überlauf Ich brauche eine C-Funktion in meinem C++ Programm aufzunehmen beim Kompilieren des Codes mit g ++ erhalte ich die folgende Warnung:g ++ + strncat: könnte Zielpuffer

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); 
[..] 

Wie kann ich diese Warnung loswerden?

+0

Willkommen bei StackOverflow! Bitte schauen Sie sich die FAQ an: http://stackoverflow.com/faq –

+0

ouh, dummer Fehler :) Ich habe den Fehler msg falsch gelesen, der Fehler war auf einer anderen strncat Verwendung, wo ich nur die Größe des Puffers als Größe übergeben Parameter => behoben :) – fho

+0

Sie sollten std :: string verwenden. Sie sind einfacher zu benutzen. Unterstützung für die Verkettung eingebaut und sie sind auch sicherer zu verwenden. – bruno

Antwort

1

Ihr Code ist sicher (glaube ich), aber die strncat() Funktion ist nur sicher zu verwenden, wenn Sie die Länge kennen:

  1. der Puffer
  2. das Material bereits im Puffer

Wenn Sie auch die Länge des hinzuzufügenden Materials kennen und diese kürzer ist als der verfügbare Platz, können Sie einfach memmove(); Wenn es länger ist, sollten Sie melden, dass Sie es abschneiden; Wenn Sie die Länge des hinzuzufügenden Materials nicht kennen, sollten Sie es vielleicht tun (damit Sie melden können, dass Sie etwas abschneiden), aber wenn das unbequem ist, können Sie immer noch memmove() verwenden und am Ende eine Null hinzufügen der Puffer, um eine Null-Beendigung sicherzustellen.

1

Von einem Kommentar geschrieben:

der Fehler auf einem anderen strncat Gebrauch waren, wo ich nur die Größe des Puffers als Größenparameter übergeben => Fest

strlcat() stellt eine einfachere Schnittstelle zu die Art der Verkettung, die Sie ausführen - entworfen, um genau diese Art von Fehler zu verhindern (vergessen Sie, die Länge der Zeichenfolge zu berücksichtigen, die sich bereits im Puffer befindet).

Wenn Ihre Toolchain es nicht hat, hat die OpenBSD-Version eine ziemlich liberale Lizenz, und wenn Sie das aus irgendeinem Grund nicht integrieren können, ist es eine ziemlich einfache Funktion, um sich selbst zu implementieren Randbedingungen, wenn Sie diesen Weg gehen). Tun Sie dies einmal, und Sie können Fehler vermeiden, die durch unsachgemäßen Gebrauch von strncat() für immer verursacht werden. Die Arten von Fehlern, die Sie möglicherweise bei der unsachgemäßen Verwendung von strlcat() bekommen, sind wahrscheinlich weniger schwerwiegend (das Vergessen der Überprüfung auf Kürzung ist normalerweise weniger problematisch als Pufferüberläufe).