fopen在响应不相关的char缓冲区时崩溃
fopen crashing in response to unrelated char buffer
所以我有一个C++函数,它接收一个字符串和一个标志,并根据标志将它们写入日志。在适当地填充将被写入文件的字符缓冲区之后,我调用fopen。这个fopen基于某些随机输入持续崩溃(在大多数情况下)。这是代码:
int log_command(char* source, int flag)
{
char *log_file_name = "db.log";
char *buffer = NULL;
int rc = 0;
SYSTEMTIME st;
FILE *fhandle = NULL;
switch(flag){
case 0:
buffer = (char*)calloc(1, strlen(source)+ 18/* 18: size for timestamp, quotes and */);
GetSystemTime(&st);
sprintf(buffer, "%04d%02d%02d%02d%02d%02d "%s"n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, source);
break;
case ROLLFORWARD:
sprintf(buffer, "RF_STARTn");
break;
case BACKUP:
sprintf(buffer, "BACKUP %s", source);
break;
}
printf("fopen attemptn");
// Print buffer info for stackoverflow
printf("%sn", buffer);
print_mem(buffer, strlen(buffer));
if( (fhandle = fopen(log_file_name, "a") ) == NULL ){ // Randomly crashes
rc = FILE_OPEN_ERROR;
}
else{
printf("fopen successn");
if(info) printf("Logging to %s: "%s" n", log_file_name, buffer);
fwrite(buffer, strlen(buffer), 1, fhandle);
fclose(fhandle);
}
return rc;
}
当缓冲区中有以下文本时:
20160513050408 "insert into other values(120)"
和原始字节数据,如:
32 30 31 36 30 35 31 33 30 35 30 34 30 38 20 22 20160513050408 "
69 6e 73 65 72 74 20 69 6e 74 6f 20 6f 74 68 65 insert into othe
72 20 76 61 6c 75 65 73 28 31 32 30 29 22 0a r values(120)".
它会持续崩溃一段时间。。然后无处可去。当*source有4176,或者大多数其他数字而不是120时,它就可以正常工作。
您没有为buffer
分配足够的字符。因此,你最终会在内存上写下不应该写的内容,这会导致未定义的行为。
您在对sprintf
的调用中使用了以下格式。
"%04d%02d%02d%02d%02d%02d "%s"n"
该格式说明符的需求是:
st.wYear
的4
字符st.wMonth
的2
字符st.wDay
的2
字符st.wMonth
的2
字符st.wMinute
的2
字符st.wSecond
的2
字符- 空间字符的
1
字符 "
的1
字符source
的strlen(source)
字符"
的1
字符n
的1
字符1
字符表示终止的空字符
您至少需要strlen(source) + 19
个字符。
更改
buffer = (char*)calloc(1, strlen(source)+ 18);
至
buffer = (char*)calloc(strlen(source) + 19, 1); // Make it 19 or higher.
相关文章:
- 当回溯以零开始时,如何调试崩溃
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 程序崩溃并显示"std::out_of_range"错误
- Xaudio2在更改缓冲区或循环时弹出声音
- CoInitialize()在单独的线程上崩溃而不返回
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 写入索引缓冲区时崩溃
- fopen在响应不相关的char缓冲区时崩溃
- 协议缓冲区初始化期间崩溃
- 具有大数据长度的解压缩缓冲区正在崩溃
- 共享内存环形缓冲区崩溃