powerPC中的pclose问题

时间:2017-10-16 10:34:21

标签: 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) {
  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设备上,为什么会这样?

1 个答案:

答案 0 :(得分:4)

  

我的应用程序返回main,就像再次调用main()一样

如果我不得不赌博,我会说你的代码崩溃了,你看到的实际上是一个自动软复位。

但为什么程序会崩溃?

我认为这是因为您在没有任何限制检查的情况下调用strcat()。您读取的每一行可以长达2048个字节,而整个连接的字符串也只有2048个字节。

可能只是你的缓冲区定义得太接近FILE *fptr,因此它会覆盖它,pclose()会尝试关闭无效的处理程序并崩溃。

验证这是问题,请尝试将char str[2048]更改为char str[65536]并查看是否重现。

修复该问题,请使用更安全的strncat代替strcat以避免内存损坏。