Закрыть вопрос в 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() вызывается снова, это происходит только на PowerPC, но не на устройствах ARM, почему это так?

1 ответ

Решение

мое приложение возвращается к основному, как будто main() был вызван снова

Если бы мне пришлось играть в азартные игры, я бы сказал, что ваш код дает сбой, и вы видите, что на самом деле это автоматический программный сброс.

Но почему происходит сбой программы?

Я считаю, что это происходит потому, что вы звоните strcat() без какой-либо обязательной проверки. Каждая строка, которую вы читаете, может быть длиной до 2048 байтов, тогда как вся конкатенированная строка также имеет длину всего 2048 байтов.

Может случиться так, что ваш буфер определен слишком близко к FILE *fptrтаким образом, это переопределяет это и pclose() пытается закрыть неверный обработчик и вылетает.

Чтобы убедиться, что это проблема, попробуйте изменить char str[2048] в char str[65536] и посмотрим, воспроизводится ли он.

Чтобы решить проблему, используйте безопасный strncat вместо strcat чтобы избежать повреждения памяти.

Другие вопросы по тегам