powerPC中的pclose问题
我正在为一个嵌入式系统创建一个应用程序,它使用popen运行/usr/bin/find,但是我遇到了一个奇怪的问题, 我的代码有点像powerPC中的pclose问题,c,arm,embedded,powerpc,C,Arm,Embedded,Powerpc,我正在为一个嵌入式系统创建一个应用程序,它使用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) {
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;
}
intmain(){
char str[2048]
fun1(str,2048);
返回0;
}
内部fun1(字符*str,内部cap){
返回fun2(str,,cap);
}
int fun2(字符*str,字符*cmd,字符cap){
文件*fptr=popen(cmd,“r”);
字符行_缓冲区[2048];
int-total=0;
整数计数=0;
str[0]='\0';
而(计数=(fgets(line_buffer,sizeof(line_buffer,fptr))!=0){
总数+=计数;
strcat(str,行缓冲区);
}
pclose(fptr);
返回总数;
}
调用pclose时,我的应用程序返回main,就像再次调用main()一样,这只发生在PowerPC上,而不发生在ARM设备上,这是为什么
我的应用程序返回main,就像再次调用main()一样
如果我不得不冒险,我会说你的代码崩溃了,你看到的实际上是一个自动软重置
但是为什么程序会崩溃呢
我认为发生这种情况是因为您调用了strcat()
,而没有进行任何绑定检查。您读取的每一行可以长达2048字节,而整个连接字符串也只有2048字节长
您的缓冲区定义得太靠近FILE*fptr
,因此它会覆盖它,并pclose()
尝试关闭无效的处理程序并崩溃
要验证这是否是问题所在,请尝试将char-str[2048]
更改为char-str[65536]
,然后查看它是否重现
若要修复该问题,请使用更安全的strncat
而不是strcat
,以避免内存损坏
我的应用程序返回main,就像再次调用main()一样
如果我不得不冒险,我会说你的代码崩溃了,你看到的实际上是一个自动软重置
但是为什么程序会崩溃呢
我认为发生这种情况是因为您调用了strcat()
,而没有进行任何绑定检查。您读取的每一行可以长达2048字节,而整个连接字符串也只有2048字节长
您的缓冲区定义得太靠近FILE*fptr
,因此它会覆盖它,并pclose()
尝试关闭无效的处理程序并崩溃
要验证这是否是问题所在,请尝试将char-str[2048]
更改为char-str[65536]
,然后查看它是否重现
若要修复该问题,请使用更安全的
strncat
而不是strcat
,以避免内存损坏。fun2()忽略cap参数。I如果行中的红色字符总数超过2014,将发生缓冲区溢出。另外:total计数器统计成功调用FGET的次数,而不是行数或字符数。程序中未定义行为错误的一个特定指标是,它在某些平台上中断,但似乎在其他平台上工作(潜在错误)。strcat()这是一种极为低效的方法——它必须在每次迭代中找到字符串的结尾,而您已经知道字符串的结尾在哪里。使用值total
为缓冲区编制索引,改为strcpy()
,然后在strcpy()
之后增加total,之前不要忘记测试total+count
。或者甚至不要复制-直接读取到目标缓冲区中的偏移位置,使用缓冲区中剩余空间给定的允许大小。fun2()将忽略cap参数。I如果行中的红色字符总数超过2014,将发生缓冲区溢出。另外:total计数器统计成功调用FGET的次数,而不是行数或字符数。程序中未定义行为错误的一个特定指标是,它在某些平台上中断,但似乎在其他平台上工作(潜在错误)。strcat()这是一种极为低效的方法——它必须在每次迭代中找到字符串的结尾,而您已经知道字符串的结尾在哪里。使用值total
为缓冲区编制索引,改为strcpy()
,然后在strcpy()
之后增加total,之前不要忘记测试total+count
。或者甚至不要复制-直接读取到目标缓冲区中的偏移位置,使用缓冲区中剩余空间给定的允许大小。