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

    +139

    1. 1
    2. 2
    3. 3
    4. 4
    char *reg = data;
    char *temp = "blahblah is ";
    
    strcat(temp,(const char*)"reg[4]");

    Как оказывается на Си можно конкатенировать строки

    Запостил: Kortez, 15 Августа 2011

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

    • Это было больно... Скорее всего, "blahblah is " попадёт в .rodata, и конкатенация перепишет другие данные. Не падает с SIGSEGV?
      Ответить
      • про .rodata сильно, очень сильно

        дай угадаю, получил диплом месяц назад?
        Ответить
        • несколько лет назад.
          Ответить
        • В стандарте строго не оговорено где и как в данном случае будет располагаться строка "blahblah is ". Она может как оказаться в .rodata так и просто в .data - это дано на отмажку компилятору.

          вот в:
          char temp[] = "blahblah is ";
          данная строка обязана располагаться в секции .data дабы в дальнейшем её можно было модифицировать.
          Ответить
        • Похоже, что gcc 4.6 помещает такие строки в .rodata. Ниже привожу пруф.
          Код:
          /* segment.c */
          #include <string.h>
          
          int main() {
            char *data = "To infinity ";
            strcat(data, "and beyond!");
            return 0;
          }

          Компилим:
          > gcc segment.c -o segment

          Запускаем:
          > ./segment 
          Segmentation fault (core dumped)

          что и требовалось доказать. Проверяем сегменты:
          > readelf -a segment
          [Nr] Name              Type            Addr     Off    Size
          ...
          [15] .rodata           PROGBITS        080484c4 0004c4 000025

          "To infinity " с учётом нуля 13, "and beyond!" - 12. Итого 25 байт, всё сходится.
          Ответить
    • Какую роль здесь играет первая строчка?
      Ответить
      • reg - это какие-то строковые данные.
        далее - дописать в temp строку из reg начиная с 5го символа.
        Ответить
        • Это какой-то другой Си, или запись "reg[4]" уже перестала быть строковым литералом?
          Ответить

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