Разрушение стека НЕ ​​обнаружено с помощью элемента C struct и sprintf - PullRequest
0 голосов
/ 15 апреля 2020

В этом C коде я определяю структуру, содержащую массив char длиной 4, за которым следует целое число. Затем я обновляю значение массива char с помощью sprintf с массивами длиной 4 и 5.

struct myStruct 
{
  char str[4];
  int num;
};

int main(int argc, char* argv[])
{
  struct myStruct s = {"abcd", 0};
  printf("%s %d\n", s.str, s.num);
  sprintf(s.str, "efgh");
  printf("%s %d\n", s.str, s.num);
  sprintf(s.str, "ijklm");
  printf("%s %d\n\n", s.str, s.num);

  return 0;
}

Вывод:

abcd 0
efgh 0
ijklm 109

При обновлении s.str с массивом длина 5 ("ijklm"), он без ошибок переполняется до s.num (109 - значение ASCII для m).


При выполнении вне структуры аналогичное присваивание приведет к при обнаружении разрушения стека (плюс предупреждения компилятора при использовании gcc -Wformat-overflow):

char str[4] = "abcd"; 
printf("%s\n", str);  
sprintf(str, "ijklm");
printf("%s\n", str);  
abcd
ijklm
*** stack smashing detected ***: terminated

Вопрос: Почему нет разрушения стека (или аналогичного переполнения) обнаружение при назначении слишком длинного массива char для члена структуры?

Обратите внимание, что я не спрашиваю, как исправить пример кода. Это делается путем увеличения размера члена структуры или динамического выделения c (например, Выделение структуры с гибким элементом массива ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...