Няшная / Говнокод #2848 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
char str[STR_LEN + 1]; 

strncpy(str, inpust_str, STR_LEN);
xxx[STR_LEN] = '\0';

str[ strlen(str) ] = ':';
str[ strlen(str) + 1 ] = '1';
str[ strlen(str) + 2 ] = '\0';

Попытка добавить ":1" к строке.

Первым же "str[ strlen(str) ] = ':';" гробим нулевой символ в конце строки. Дальнейшие вызовы "strlen" - просто фигня какая-то. Ну и портим память.

Запостил: benderlog benderlog, (Updated )

Комментарии (7) RSS

  • хоть код и говно траблы будут только при strlen(inpust_str) > STR_LEN - 2
    Ответить
    • При strlen(inpust_str) > STR_LEN - 2 проблемы однозначно!

      Но тут ещё нюанс.
      Положим:
      a. input_str = "abc";
      b. STR_LEN = 10;

      после строки 4 имеем в str = { 'a', 'b', 'c', '\0', ?, ?, ?, ?, ?, ?, '\0' };

      Строка 6: strlen(str) = 3;
      str [6] = ':'

      после строки 6 имеем в str = { 'a', 'b', 'c', ':', ?, ?, ?, ?, ?, ?, '\0' };

      Строка 7: strlen(str) = от 4 до 10; в зависимости от того, что там в вопросиках. Если в вопросиках нет нулевого символа, то точно вернётся 10.
      str [10] = '1';
      после строки 6 имеем в str = { 'a', 'b', 'c', ':', ?, ?, ?, ?, ?, ?, '1' };
      '\0'-терминатор в конце строки str потерян!

      Строка 8: strlen(str) в зависимости от того, что там в вопросиках вернёт число от 4 до ??????
      И в итоге memory corruption - привет!
      Ответить
    • насколько я помню, при пользовании strncpy, если строка меньше указанного лимита, недостающие символы заменяются на '\0'
      Ответить
      • Верно. man strncpy:
        В случае, если длина src меньше, чем n, то остаток dest будет заполнен нулями.
        Ответить
        • все равно говно. для этой цели существует snprintf() который еще в отличии от strncpy() гарантирует 0 завершение производимой строчки.
          Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8