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

    +31

    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;
    
    struct RefStruct {
        RefStruct(int &ref) :
            m_ref(ref)
        {}
        
        int getRefValue() const {
            return m_ref;
        }
    
    private:
        int &m_ref;
    };
    
    int main(int argc, char *argv[]) {
        int a = 0xa;
        int b = 0xb;
    
        RefStruct s(a);
        RefStruct *p = &s;
        
        *(reinterpret_cast<int **>(p)) = &b;
        
        cout << "RefValue: " << hex << s.getRefValue() << endl;
    
        return 0;
    }

    С другом разговаривали - как бы получить указатель на ссылку.

    Как вы думаете, что будет на выхлопе?

    Запостил: Elvenfighter, 15 Июля 2012

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

    • Внимание спойлер!

      s.getRefValue() == 0xA
      А чего вы ожидали? Значение m_ref изменяется только в конструкторе!

      Кому лень копипастить проверять:
      http://ideone.com/7dRGP
      Ответить
    • Стандарт (c++98, 8.3.2 References) гласит:
      3. It is unspecified whether or not a reference requires storage
      4. There shall be no references to references, no arrays of references, and no pointers to references.

      Только что вы убедились, что UB это действительно UB - с другим компилятором, с другими опциями, с немного другим кодом, результатом вполне могло быть и 0x0B.
      P.S. А вот выше Elvenfighter и показал вторую сторону этого UB'а.
      Ответить
    • Никак не могу обдурить escape analysis в g++ 4.6. Не передаю никуда RefStruct - десятка попадает сразу в вывод. Но как только добавляю передачу ссылки\указателя на RefStruct куда-либо (но так чтобы он это куда-либо не заинлайнил, т.к. если есть возможность заинлайнить, и код не портит ссылку - остается тупо вывод десятки) - сразу убирает оптимизацию с проскоком 0x0a, и пишет честный код...

      Вот так вот через пару лет не на чем будет показать, что ситуация в топике - UB ;(

      P.S. Попутно заметил, что конструкцию for (int i=0; i<1000; i++) { pp += i*10; } gcc умудряется откомпилить в addl $4995000, %eax...
      Ответить
    • В этой ветке, имеющей рейтинг +1, все комменты будут иметь рейтинг +1.
      Ответить
      • Тред добра же.
        Ответить
      • В этой ветке, имеющей рейтинг +N, все комменты будут иметь рейтинг +N.
        Ответить
        • "Допустим по небу летело N самолётов, нет, N много, пусть будет K самолётов..."(с)
          Ответить
    • В этой галактике "strict aliasing" уже отменили чтоли?
      Ответить

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