1. Си / Говнокод #2848

    +96

    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, 23 Марта 2010

    Комментарии (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 - привет!
        Ответить
    • Наврал про 1-й "str[ strlen(str) ] = ':';"
      Но второй - точно
      Ответить
      • насколько я помню, при пользовании strncpy, если строка меньше указанного лимита, недостающие символы заменяются на '\0'
        Ответить
        • Верно. man strncpy:
          В случае, если длина src меньше, чем n, то остаток dest будет заполнен нулями.
          Ответить
          • все равно говно. для этой цели существует snprintf() который еще в отличии от strncpy() гарантирует 0 завершение производимой строчки.
            Ответить
        • Вот блин - верно
          Ответить

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