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

    −45

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    void foo()
    {
      int i;
      if(0 == i)
      {
      	printf("foo\n");
      }
      if(0 != i)
      {
      	printf("bar\n");
      }
    }

    https://godbolt.org/g/TL7tTW
    Ясно

    Запостил: DlangGovno, 13 Января 2017

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

    • Какой кот Шрёдингера!
      Ответить
    • Цитируя некоторых, "Обращение к неинициализированной переменной - UB. При UB компилер вправе делать что угодно, в том числе поджечь твой дом и убить твою собаку."
      Ответить
      • Откуда взялась эта хуйня? Дайте цитату из стандарта про дом и собаку.
        Ответить
      • Я всегда думал, что обращение к Integer безопасно, даже если переменная не инициализирована. Ведь там же не идёт неявных распределений памяти.
        Ответить
        • Ты имеешь ввиду что чтобы у тебя там в стеке ни лежало -- оно всегда может быть рассмотрено как интеджер?
          Ну типа будет у тебя там 0x42, и пусть будет, да?
          Ответить
          • я так понимаю, что неинициализированный Integer будет содержать произвольное число, от -MaxInt..MaxInt. Разве нет?
            Ответить
            • Больную тему ты поднял.
              На вот, почитай: http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c
              Ответить
        • Ага, если там случайно по фазам луны оказалось значение которое case ПуститьРакетыНаЛосАнджелес:?
          Ответить
      • в си int на стеке по умолчанию равен нулю в C++ нет
        Ответить
    • самое смешное что может быть true и там и сям
      Ответить
    • Ну это вообще UB.
      Ответить
      • конечно

        именно потому умничнка GCC выпилил весь код к хуям
        Ответить
        • Это была вариация на тему "ну это вообще пушка!". Читать надо как бы удивленной восклицающей интонацией, но сдержанно, с толикой иронии.
          Ответить
        • вообще-то там clang
          Ответить
      • UBoa
        Ответить
    • Поскольку физическая память имеет недостаток в том, что не может находится в не инициализированной суперпозиции, то любое обращение к памяти является безопасным, в том числе обращение к не инициализированной переменной и будет возвращать определённый результат. Поэтому обращение к не инициализированной переменной не является UB, не смотря на ошибочные взгляды на этот вопрос в стандарте. Более того, компилятор не имеет права удалять код, даже если его результат не используется, если он имеет какие либо коррумпирующие эффекты (IO и подобные операции). В общем, GCC облажался.
      Ответить
      • ололо
        Ответить
      • Ну пойди со стандартом поспорь, лалка

        И причем тут физическая память?
        Ответить
        • > со стандартом поспорь
          Никто не имеет права спорить со священным Стандартом?
          Ответить
      • > физическая память
        А компилятор и не обязан размещать переменную в физической памяти. Часть переменных в регистры падает, часть - вообще отбрасывается.
        Ответить
        • Как раз недавно обсуждали вопрос переноса ГК в мир платоновых идей.
          Ответить
        • Копелятор не имеет доступа к физ памяти
          Он юзерспайс программа
          Ответить
          • Когда под всякие контроллеры без mmu компилишь, можно указать линкеру по каким физическим адресам надо засунуть секции.

            Так что нехуй тут к словам придираться.
            Ответить
      • > даже если его результат не используется
        Конпелятор удаляет код не потому что результат не используется, а из-за того, что эта ветка в графе управления зашкварена UB'ом. Конпелятор считает, что программист - няша, который UB'ов не допускает. Поэтому эта ветка недостижима и её можно выкинуть.
        Ответить
        • Вообще, с точки зрения llvm,
          'the special undefined value u is introduced as the
          result of erroneous computations, such as reading from an
          uninitialized memory location as a replacement of an arbi-
          trary constant value. This special value propagates through
          every assignment and arithmetic operation'
          Конпелятор может принять это u за любое значение, удобное в данный конкретный момент, даже разное в разных местах.
          http://plv.mpi-sws.org/llvmcs/paper.pdf
          Еще пишут, что можно получить такое u если он задетектит незащещенное атомиками чтение/запись из разных потоков, но заабузить это не удалось и не уверен, что это вообще заимплеменчено.
          Ответить
        • Тут, кстати, сразу напрашивается решение. В стандарте нужна прагма, с помощью которой программист сможет признаться компилятору во всех своих наклонностях.

          #pragma rainbow


          Можно даже с опциями типа перечня UB.
          Ответить
      • Какая редкостная бредятина. В мире языков С и С++ нет и никогда не было никакой "физической памяти". Есть только некое эзотерическое "storage". Что за ним скрывается - никто не знает. Но хорошо известно, что неинициализированная переменная в С и С++ не только непредсказуема, но и нестабильна.
        Ответить
    • было бы конечно логичнее, если бы компилятор вместо выкидывания ветки из-за ub выдавал ошибку компиляции.
      Ответить
      • Ну он ворнинг таки выдал.
        Ответить
      • если бы компилятор выдавал ошибку, это не было бы уб
        Ответить
      • ну это было б не си тогда
        в сях ты сам следишь за такими вещами

        хотя я и не могу понять зачем оно может быть нужно.
        Ответить

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