- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
void foo()
{
int i;
if(0 == i)
{
printf("foo\n");
}
if(0 != i)
{
printf("bar\n");
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−45
void foo()
{
int i;
if(0 == i)
{
printf("foo\n");
}
if(0 != i)
{
printf("bar\n");
}
}
https://godbolt.org/g/TL7tTW
Ясно
Ну типа будет у тебя там 0x42, и пусть будет, да?
На вот, почитай: http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c
именно потому умничнка GCC выпилил весь код к хуям
И причем тут физическая память?
Никто не имеет права спорить со священным Стандартом?
А компилятор и не обязан размещать переменную в физической памяти. Часть переменных в регистры падает, часть - вообще отбрасывается.
Он юзерспайс программа
Так что нехуй тут к словам придираться.
Конпелятор удаляет код не потому что результат не используется, а из-за того, что эта ветка в графе управления зашкварена UB'ом. Конпелятор считает, что программист - няша, который UB'ов не допускает. Поэтому эта ветка недостижима и её можно выкинуть.
'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 если он задетектит незащещенное атомиками чтение/запись из разных потоков, но заабузить это не удалось и не уверен, что это вообще заимплеменчено.
Можно даже с опциями типа перечня UB.
в сях ты сам следишь за такими вещами
хотя я и не могу понять зачем оно может быть нужно.