Die meisten Implementierungen von sprintf()
kopieren nicht die Formatzeichenfolge und verwenden stattdessen einen Zeiger innerhalb der übergebenen Zeichenfolge. Wenn Format und Ausgabe auf denselben Speicher verweisen, führt dies zu ungeraden Ergebnissen.
Und Sie sollten wirklich snprintf()
verwenden, die Sie vor Pufferüberläufen schützt.
Um alle Anrufe zu finden, setzen Sie #define sprintf +++
in einen gemeinsamen Header suchen und alle Quellen neu kompilieren. Das sollte Ihnen eine Liste von Fehlern zusammen mit dem Dateiname und den Zeilennummern geben :) Oder verwenden Sie die rekursive Suche nach Ihrer IDE.
Wenn Sie diese Liste trimmen wollen bis auf die, wo Sie den gleichen Zeiger für beide Argumente verwenden, verwenden Sie das Makro:
#define sprintf(output,format,...) check_sprintf(__FILE__,__LINE__,output,format,....)
Beachten Sie, dass nicht alle Compiler-Unterstützung von Makros mit varargs. definieren Sie dann eine neue Funktion check_sprintf
:
int check_sprintf (char*filename,int line,char*output,char*format,...) {
va_list args;
int len;
if(output==format) {
fprintf(stderr,
"Output and format are the same at %s:%d", filename, line);
abort();
}
va_start (args, format);
len = vsprintf (output, format, args);
va_end (args);
return len;
}
[EDIT] Ich habe gerade gesehen, dass Sie über den Ausgang und das erste Argument sprechen. Sie können den Code von oben wiederverwenden und va_arg()
aufrufen, um das erste Argument zu erhalten und das im Vergleich zu verwenden.
Duplikat von http://StackOverflow.com/Questions/1283354/is-SprintfBuffer-S-Buffer-Safe – Alon