- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
#include <stdio.h>
int main() {
char* pituh;
puts(pituh);
pituh = "kokoko";
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
#include <stdio.h>
int main() {
char* pituh;
puts(pituh);
pituh = "kokoko";
return 0;
}
Угадайте что выведет код?
ISO и прочим скилловикам просьба воздержаться.
https://ideone.com/sYrqiB
Игра с ранним/поздним присваиванием. Примерно такой же трюк описан в справке по дельфе, с комментарием "присваивание происходит раньше, чем разыменовывание, однако, полагаться на это не стоит".
Вай ме, чуть напутал. Литералы помещаются в память доступную только для чтения и это происходит много раньше, чем разыменование. Ах-ах, детка, м-м-м... Я кончил!
Хм. Довольно странный трюк. Если закомментировать присваивание, указатель не пуст. Если раскомментировать - пуст. Прога выведет пустую строку.
Экономия одной инструкции для инициализации это спичка, и в 99% случаев ты этой экономии даже не заметишь, так что безопаснее всё всегда иинициализировать
нужен указатель на ноль, а не нулевой указатель
Значение автоматической переменной по умолчанию не определено, так что компилятор имеет право
1. Выкинуть puts вообще.
2. Попытаться вывести строку с незвестного адреса, и получить фолт
3. Однако наверное он имеет право также слить его с шестой строкой, и выдать kokoko
В принципе, вопрос "что будет делать компилятор в случае UB" не совсем корректен
По-хорошему должен выдавать сигнал «обнаружено UB», чтобы периферийные устройства могли поймать этот сигнал и отреагировать на него. Мне нравится идея чехла на кресло, которорое будет бить током при обнаружении UB.
Возможность выпила ненужного говна
заработанное!
> куда
сюда!
Мне просто скоро надо будет из Нидеров в Россию переводить бобло, я буду просить коллег со счетами в России скидывать мне на российский счет, а им буду на голландский (им как раз из Роисси в Европку бабло не вывести)
Вдруг тебе тоже надо
Правильный ответ: поведение не определено.
> говнокорректно
> говректно
> говно
Даже по дедукции ответ отчевиден
забавно
> Угадайте что выведет код?
без указания компилятора конечно нещитово
Действительно, забавно и неожиданно. Никогда такого не было, и вот опять
Это вообще характерно для UB
> Я ожидаю функционально идентичный выхлоп от компилятора вне зависимости от уровня оптимизации.
мм.. а ты же Java программист, да?
>по правилам хорошего тона
Дурным тоном считается писать код с UB:)
Уж сколько раз твердили миру…
Программа с «UB» не является корректной. «Правила хорошего тона» распространяются только на корректные программы.
Когда поведение определено Стандартом — да, компилятор обязан выдавать функционально идентичные программы вне зависимости от уровня оптимизаций (и компиляторы это делают — с поправкой на различные баги, разумеется).
Когда же ты даёшь компилятору мусор — компилятор выдаёт в ответ мусор. Точка.
У меня сегфолт проявляется выборочно на разных запусках одной и той же программы, потому что иногда говно в памяти указывает на корректную область памяти. Я, может, ожидаю идентичного выхлопа от ОС и железа, который не будет менятся в зависимости от фазы луны, но, если подаёшь на вход говно, получаешь говно.
То есть либо ты пишешь по стандарту и по модели памяти, либо завязываешься на фазу луны
Не совсем. Идентичность выхлопа ожидается только на наборах данных, на которых не триггерится UB. Остальные случаи не имеют смысла и не рассматриваются.
We say that a program c1 approximates a program c2 when, for each of the initial states for which c1 terminates, c2 also terminates and produces the same final state [1].
Вот собственно этой аппроксимацией и занимается конпелятор крестов. А для UB'ов стандарт просто не описывает операционную семантику.
[1] Software Foundations, Volume 2: Programming Language Foundations, Program Equivalence
будь здоров
Как на ideone опции копулятора подергать?
https://habr.com/ru/company/beelinekz/blog/667878/
Джава очень удобный язык, даже 17-тилетний парень может стать сенёром
Зачем вы пишете на своем сложном си??
"очевидно же, здесь UB"
"Правильный ответ: поведение не определено."
Ну или, если вопрос "угадайте", то есть "угадайте, что выведет код в некоторых условиях, которые находятся по ссылке", то первый коммент:
"Выведет ко-ко-ко.". Потому что иначе зачем эта строчка.
Причем только в консольи. В обычной, нормальной проге с гуем был бы заведомый вылет либо мусор на выхлопе. А тут - 0. Ниль, блять, ниль. Кто его занилил и зачем?
Еще бы знать всех уёбков, а то иногда отвечаешь на нормальный комментарий, а тебе говорят, что ты пиздишь с уёбком, педофилом и дельфистом из Осетии и не соблюдаю cancel-культуру. А я взрослый дядя и крестовик-насильник из России - жаль! если бы я был маленьким мальчиком из Осетии, я бы попросил его тоже научить меня программировать на дельфи.
Цитата из неизданных трудов Ницше?
"Правильный ответ: поведение не определено."
Да ну на хуй! А мы тут пыжимся, хуячим, изображаем знатоков.