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

    +23

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    #include <iostream>
    using namespace std;
     
    class Class {
    public:
        explicit Class(int a) : m_int(a) {}
        
        int get() const { return m_int; }
        
        void swapThis(int a) {
            delete this;
            Class **thisptr = reinterpret_cast<Class**>(&a);
            thisptr--;
            *thisptr = new Class(a);
            cout << "this: " << this << endl
                 << "that: " << *thisptr << endl;
        }
    private:
        int m_int;
    };
     
    int main() {
        Class *s = new Class(13);
        s->swapThis(42);
        cout << s->get() << endl;
        delete s;
        
        return 0;
    }

    Что творит хакингкостылинг + инлайн методы.
    http://ideone.com/5Kyitw

    Запостил: Elvenfighter, 29 Декабря 2012

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

    • Некрофилия....
      Ответить
    • Везение, отличное везение... а вдруг аллокатор выделит память не в том же месте, где лежал старый объект? И this внутри и снаружи рассогласуются? Ведь в строке 14 поменяли только локальный this, а s, описанный в строке 23, никто не поменял, и в нем адрес старого объекта... А вообще - компилятор спокойно мог передать this через какой-нибудь регистр ecx, и этот код бы запорол вместо локального this адрес возврата...

      Автор рисковый парень ;)

      http://ideone.com/WY9qdS
      Ответить
      • А ещё тут есть зависимость от конвенции, что this (1й параметр метода, неявный) находится в памяти сразу перед a.
        Самый черезжопный способ получения this, я долго втыкал. Школолокулхацкерство как оно есть.
        Ответить
        • > находится в памяти
          Ага. Вообще не факт, что он находится в памяти. Мало того, что компилятор имеет право передать this в регистре, так он еще и заинлайнить swapThis может, и никакой передачи вообще не будет...
          Ответить
        • >находится в памяти
          или на диске в свопе
          Ответить
          • А это совсем не помешает, операционка всосет страничку из свопа в память, и перезапустит прогу с того же места...
            Ответить
      • Можно и так сказать:
        Class **thisptr = reinterpret_cast<Class**>(&a) - 1;  // прицеливаемся
        *thisptr = new Class(a); // стреляем
        Ответить
      • http://ideone.com/FXV8F8
        Ответить
        • В этом коде уже нет хакерского духа оригинала... В коде ОП'а была красивая (хотя и безуспешная) попытка подменить this, а у вас простой, и , если не туплю, нигде не нарушающий стандартов код.
          Ответить
          • Кроме только висящего в воздухе new
            Ответить
            • Ну это нью стандартов не нарушает. Просто утечка памяти.
              Ответить
    • >reinterpret_cast
      И код становится машиннозависимым
      Ответить
    • предлагаю добавить как язык программирования шахматы: что бы можно было FEN вкопипастить и ГК его отобразил как шахматную доску. вот мы бы тогда еще могли еще и с шахматных позиций поржать.

      вобщем что я хочу сказать: меня ГКды, специально писаные для ГК, утомляют еще больше чем школьные ГК. по крайней мере в последних есть эта наивная искренная неопытность и детское упрямство.
      Ответить
      • Тогда каждый первый тред будет начинаться постом "поясните мысль".

        А синтетика да, не веселит.
        Ответить
        • > А синтетика да, не веселит.
          Ну почему, попадается иногда веселая синтетика. Мне например этот код понравился настойчивыми попытками обмануть компилятор, и подсунуть ему другой this.
          Ответить
          • Пожалуй и не отличишь эйфории от созерцания качественной синтетики и реального ГК. Разница только в том, что в первом случае никто не плачет.
            Ответить
            • Ну разве что кто-то получает садистское удовольствие от размышлий над плачами и стонами тех, кому приходится поддерживать реальный ГК. Вот тогда есть разница.
              Ответить
              • А я думал ты вы снова процитируете Златоуста. Что-нибудь о сострадании...
                Ответить
                • „И я взглянул, и вот, конь бледный, и на нем всадник, которому имя «смерть»; и ад следовал за ним; и дана ему власть над четвертою частью земли - умерщвлять мечом и голодом, и мором и зверями земными.“
                  Ответить

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