1. C++ / Говнокод #6207

    +146

    1. 1
    this++;

    Думаю, так нельзя в члене класса, но выглядит все равно забавно.

    Запостил: Говногость, 04 Апреля 2011

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

    • class TClass
      {
        void classMember(void)
        {
          int this;
          this++;
        };
      };
      Ответить
      • `this` - ключевое слово. Поэтому ни о каком `int this` речи быть не может.
        Ответить
    • main.cxx:8:7: ошибка: increment of read-only parameter ‘this’
      main.cxx:8:7: ошибка: lvalue required as increment operand
      Ответить
    • (*(int*)this)++;
      Ответить
      • ^^^ Не является попыткой модификации 'this'.

        Попытка подобной модификации 'this' выглядела бы так: '(*(int*) &this)++', но компилятор, разумеется, не позволит применить '&' к 'this'.
        Ответить
        • class some
          {
          public:
          some(){f1();};

          int f1()
          {
          int f;
          *((int*)(int(&f)+0x0C))=0x1234;
          void* p;
          p=this;
          return 0;
          }
          };

          Visual Studio 2002
          Под отладчиком показывает p==0x1234 :))
          указатель this передается в ф-ю через стек, переменная f располагается там же на расстоянии 0xC (выяснено опытным путем через тот же отладчик)
          Ответить
          • ну, есть разные стандарты передачи аргументов. этот для cdecl:)
            а может, что-то вроде этого:
            int f1(){
            int *p;
            asm{
            lea eax, this
            mov p, eax
            }
            *p = 0x1234;
            p = this;
            return 0;
            }
            Ответить
          • всю жизнь считал, что this передается через ecx...
            Ответить
            • Все правильно, но еще до того как начнет выполняться код функции, ecx пихается в стек и используется оттуда; т. е перезапись ecx уже ничего не даст

              про thiscall можно глянуть здесь:
              http://ru.wikipedia.org/wiki/Соглашение_вызова
              Ответить
        • ЭТО не дает покоя говнокодерам.
          Ответить
    • вот так еще можно:
      #define this i
      this++;
      Ответить

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