4 Stimmen

Wie verhindere ich einen Char-Pointer-Pufferüberlauf?

D.h..

int function(char* txt)
{
   sprintf(txt, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
}

Wenn also der Text in der Tabelle irgendwie 500 Zeichen lang war und txt in der Hauptdatei nur als 100.... definiert war

Danke.

11voto

James McNellis Punkte 337231

Sie müssen

  • der Funktion einen Parameter hinzufügen, der die Größe des Puffers angibt
  • verwenden. snprintf() anstelle von sprintf()
  • prüfen Sie den Rückgabewert von snprintf() um zu sehen, wie groß der Puffer sein muss, um alle formatierten Daten aufzunehmen; wenn dies größer oder gleich der Größe des Puffers ist, sollten Sie damit umgehen, wie Sie es für richtig halten (der Puffer wird immer noch mit Null abgeschlossen, aber der Inhalt wird abgeschnitten, damit er passt; ob dies in Ordnung ist oder ein Fehler, hängt ganz von Ihrem Anwendungsfall ab)

(und Ihre Funktion braucht einen Rückgabetyp...)

3voto

WhirlWind Punkte 13556

Sie sollten in der Lage sein, snprintf zu verwenden, um den Umfang des verwendeten Puffers zu begrenzen.

function(char* txt, size_t length)
{
   int rv;
   rv = snprintf(txt, length, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
   if (rv >= length) {
       // error
   }
}

0voto

sizzzzlerz Punkte 4101

Das einzige, was Sie tun können, ist malloc genug Speicher, formatieren Sie die Zeichenfolge in diesem Speicher, und geben Sie einen Zeiger auf sie. Die aufrufende Funktion wäre dann für das Freigeben des Speichers verantwortlich, wenn sie damit fertig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X