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