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

0

  1. 1
  2. 2
  3. 3
  4. 4
char *reg = data;
char *temp = "blahblah is ";

strcat(temp,(const char*)"reg[4]");

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

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

Комментарии (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]" уже перестала быть строковым литералом?
        Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8