Няшная / Говнокод #21970 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 DlangGovno, (Updated )

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

  • Цитируя некоторых, "Обращение к неинициализированной переменной - UB. При UB компилер вправе делать что угодно, в том числе поджечь твой дом и убить твою собаку."
    Ответить
    • Откуда взялась эта хуйня? Дайте цитату из стандарта про дом и собаку.
      Ответить
    • Я всегда думал, что обращение к Integer безопасно, даже если переменная не инициализирована. Ведь там же не идёт неявных распределений памяти.
      Ответить
    • в си int на стеке по умолчанию равен нулю в C++ нет
      Ответить
  • самое смешное что может быть true и там и сям
    Ответить
    • конечно

      именно потому умничнка GCC выпилил весь код к хуям
      Ответить
      • Это была вариация на тему "ну это вообще пушка!". Читать надо как бы удивленной восклицающей интонацией, но сдержанно, с толикой иронии.
        Ответить
  • Поскольку физическая память имеет недостаток в том, что не может находится в не инициализированной суперпозиции, то любое обращение к памяти является безопасным, в том числе обращение к не инициализированной переменной и будет возвращать определённый результат. Поэтому обращение к не инициализированной переменной не является 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 выдавал ошибку компиляции.
    Ответить
    • если бы компилятор выдавал ошибку, это не было бы уб
      Ответить
    • ну это было б не си тогда
      в сях ты сам следишь за такими вещами

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8