我正在为嵌入式系统创建一个应用程序,它使用popen来运行/ usr / bin / find,但是我遇到了一个奇怪的问题, 我的代码就像......
int main() {
char str[2048]
fun1(str, 2048);
return 0;
}
int fun1(char* str, int cap) {
return fun2(str,<command>, cap);
}
int fun2(char* str, char* cmd, int cap) {
FILE* fptr = popen(cmd, "r");
char line_buffer[2048];
int total = 0;
int count = 0;
str[0] = '\0';
while (count = (fgets(line_buffer, sizeof(line_buffer), fptr)) != 0) {
total += count;
strcat(str, line_buffer);
}
pclose(fptr);
return total;
}
当调用pclose时,我的应用程序返回main,就像再次调用main()一样,这只发生在PowerPC上而不是ARM设备上,为什么会这样?
答案 0 :(得分:4)
我的应用程序返回main,就像再次调用main()一样
如果我不得不赌博,我会说你的代码崩溃了,你看到的实际上是一个自动软复位。
但为什么程序会崩溃?
我认为这是因为您在没有任何限制检查的情况下调用strcat()
。您读取的每一行可以长达2048个字节,而整个连接的字符串也只有2048个字节。
可能只是你的缓冲区定义得太接近FILE *fptr
,因此它会覆盖它,pclose()
会尝试关闭无效的处理程序并崩溃。
要验证这是问题,请尝试将char str[2048]
更改为char str[65536]
并查看是否重现。
要修复该问题,请使用更安全的strncat
代替strcat
以避免内存损坏。