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

    +124

    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
    void f()
    {
    char d[14] = "Hello, error!";
    }
    
    void h()
    {
    char d[14];
    std::cout<<d;
    }
    
    int main()
    {
    f();
    h();
    }

    Кто отгадает, что делает этот код(а еще лучше почему он вобще работает) тому ни чего не будет.

    Запостил: hromjo, 02 Мая 2010

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

    • ммм... он выводит пустую строку?
      Ответить
    • ЭТО НЕ СИ!!!!
      Ответить
    • это не C, выводит "Hello, error!" , работает потому что в том же месте стэка содержится а память сама по себе не очищается
      Ответить
      • Ну да, очевидно же.
        Ответить
        • Ну не то, чтоб уж так и очевидно
          $ g++ -O0 test.cpp -o test && ./test
          Hello, error!
          $ g++ -O1 test.cpp -o test && ./test

          $ g++ -O2 test.cpp -o test && ./test

          $ g++ -O3 test.cpp -o test && ./test
          �"��
          Ответить
          • Ну понятно, оптимизатор тупо убивает функцию f().
            Ответить
            • Понятно, что понятно :) Я к тому, что использование не инициализированной памяти в общем случае имеет _непредсказуемые_ последствия. Возможно найдётся компилятор, с которым вообще "Hello, error!" никогда не напечатается. Так что нет, результат работы не очевиден))
              Ответить
          • и не только из-за уровня оптимизации.

            например под PowerPC т.к. f() не вызывает других функций, у нее будет другой (короткий) пролог нежели чем у h() == структура стека другая.

            я слышал что ARM такое же практикует.
            Ответить
      • По-моему он выведет мусор.
        Ответить
    • У нас уже был один загадчик. Позорно слился и пошёл плакать за сараи.
      Это просто напоминание.
      Ответить
      • может это виртуал усруса?
        Ответить
        • Не. Этот парень здесь давно. ursus новенький. Слился он зачётно. ))))
          Ответить
    • А у меня вчера поломались longjmp'ы, прыгал по стеку как бесоватый, вот было весело!
      Ответить
      • Не пользуйся им и проблем не будет.
        Ответить
      • У меня тоже однажды сломались, я пытался их починить, а там размер гаек нестандартный, пришлось разводным ключом ковырять.
        Ответить
        • У тебя таже проблема, что и у меня? O_o
          Ответить
      • Не понял, ты как умудрился? Какую память ты побил? :))
        Ответить
        • буферы для лонгджампов хранятся в хитром динамичном стеке. забыл в одном месте сбалансировать push/pop, в итоге лонгджампило не в туда.

          (люблю извращаться)
          Ответить
          • Понял. Для продакшн кода, в общем, это мало подходит, как я и подозревал.
            Ответить
            • +1
              Ответить
            • Подходит, не волнуйся. Это случилос во время баловства с макросами. Раньше маакрос был сделан так, что при ошибке сам конпелятор "несбалансировку" находит. А потом изменил - и конпелятор стал игнорировать и конпелировать.
              Ответить
    • Кто отгадает, что делает этот код(а еще лучше почему он вобще работает) тому ни чего не будет.
      -----
      а кто не отгадает?
      Ответить
    • У меня ничего не компиляет вообще :D Ни як C, ни як C++
      [07:33:44] r00t@localhost:~$ gcc test.cpp && ./a.out
      test.cpp: In function ‘void h()’:
      test.cpp:10: error: ‘cout’ is not a member of ‘std’
      [07:34:22] r00t@localhost:~$ g++ test.cpp && ./a.out
      test.cpp: In function ‘void h()’:
      test.cpp:10: error: ‘cout’ is not a member of ‘std’
      Ответить
    • Это полный говнокод и работает от только от исключительной ситуации
      Ответить

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