sprintf()
的大部分實現都不會複製格式字符串,而是在傳遞的字符串中使用指針。如果格式和輸出指向相同的內存,那將導致奇怪的結果。
而且你應該真的使用snprintf()
它可以保護你免受緩衝區溢出。
要查找所有呼叫,請將#define sprintf +++
放入共同標題查找並重新編譯所有來源。這應該會給你一個錯誤列表以及文件名和行號:)或者使用遞歸search'n'replace你的IDE。
如果要修剪下來這個列表到您使用了兩個參數相同指針的,使用這個宏:
#define sprintf(output,format,...) check_sprintf(__FILE__,__LINE__,output,format,....)
請注意,並非可變參數所有的編譯器支持宏。然後定義一個新的功能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;
}
[編輯]我剛纔看到你在談論的輸出和第一個參數。您可以重複使用上面的代碼,並調用va_arg()
以獲取第一個參數並在比較中使用它。
重複http://stackoverflow.com/questions/1283354/is-sprintfbuffer-s-buffer-safe – Alon