powerPC中的pclose问题

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) {

我正在为一个嵌入式系统创建一个应用程序,它使用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;

}
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
。或者甚至不要复制-直接读取到目标缓冲区中的偏移位置,使用缓冲区中剩余空间给定的允许大小。