- 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
Support 29.05.2022 14:41 # 0
Игра с ранним/поздним присваиванием. Примерно такой же трюк описан в справке по дельфе, с комментарием "присваивание происходит раньше, чем разыменовывание, однако, полагаться на это не стоит".
Вай ме, чуть напутал. Литералы помещаются в память доступную только для чтения и это происходит много раньше, чем разыменование. Ах-ах, детка, м-м-м... Я кончил!
Support 29.05.2022 14:48 # 0
Хм. Довольно странный трюк. Если закомментировать присваивание, указатель не пуст. Если раскомментировать - пуст. Прога выведет пустую строку.
kcalbCube 29.05.2022 16:16 # 0
guest6 29.05.2022 16:21 # −1
kcalbCube 29.05.2022 19:01 # 0
Support 29.05.2022 19:47 # 0
kcalbCube 29.05.2022 16:22 # 0
guest6 29.05.2022 17:23 # 0
Экономия одной инструкции для инициализации это спичка, и в 99% случаев ты этой экономии даже не заметишь, так что безопаснее всё всегда иинициализировать
ISO 29.05.2022 22:14 # 0
guest6 29.05.2022 22:22 # 0
ISO 29.05.2022 22:54 # 0
guest6 29.05.2022 23:47 # 0
нужен указатель на ноль, а не нулевой указатель
kcalbCube 30.05.2022 19:00 # 0
guest6 30.05.2022 19:04 # 0
Support 29.05.2022 19:32 # 0
guest6 29.05.2022 16:28 # +1
Значение автоматической переменной по умолчанию не определено, так что компилятор имеет право
1. Выкинуть puts вообще.
2. Попытаться вывести строку с незвестного адреса, и получить фолт
3. Однако наверное он имеет право также слить его с шестой строкой, и выдать kokoko
В принципе, вопрос "что будет делать компилятор в случае UB" не совсем корректен
Soul_re@ver 29.05.2022 17:51 # +1
По-хорошему должен выдавать сигнал «обнаружено UB», чтобы периферийные устройства могли поймать этот сигнал и отреагировать на него. Мне нравится идея чехла на кресло, которорое будет бить током при обнаружении UB.
guest6 29.05.2022 19:14 # 0
Возможность выпила ненужного говна
Fike 29.05.2022 21:30 # 0
guest6 29.05.2022 22:01 # 0
Fike 29.05.2022 22:45 # 0
guest6 29.05.2022 23:47 # 0
Fike 30.05.2022 00:06 # 0
заработанное!
> куда
сюда!
guest6 30.05.2022 00:12 # 0
Мне просто скоро надо будет из Нидеров в Россию переводить бобло, я буду просить коллег со счетами в России скидывать мне на российский счет, а им буду на голландский (им как раз из Роисси в Европку бабло не вывести)
Вдруг тебе тоже надо
Fike 30.05.2022 00:20 # 0
guest6 30.05.2022 00:22 # 0
nyTuH_nugop 30.05.2022 00:25 # 0
Support 29.05.2022 19:36 # 0
kcalbCube 06.06.2022 06:26 # +2
guest6 06.06.2022 09:00 # −2
ucnaHckuu_CTblD 07.06.2022 10:19 # +2
ISO 29.05.2022 16:31 # 0
Правильный ответ: поведение не определено.
guest6 29.05.2022 17:32 # 0
nyTuH_nugop 29.05.2022 17:49 # 0
nyTuH_nugop 29.05.2022 18:13 # 0
guest6 29.05.2022 18:15 # 0
nyTuH_nugop 29.05.2022 18:32 # 0
> говнокорректно
> говректно
> говно
Даже по дедукции ответ отчевиден
Support 29.05.2022 19:49 # 0
Fike 30.05.2022 00:09 # 0
забавно
> Угадайте что выведет код?
без указания компилятора конечно нещитово
guest6 30.05.2022 00:11 # −1
Действительно, забавно и неожиданно. Никогда такого не было, и вот опять
Fike 30.05.2022 00:19 # 0
guest6 30.05.2022 00:21 # 0
Это вообще характерно для UB
> Я ожидаю функционально идентичный выхлоп от компилятора вне зависимости от уровня оптимизации.
мм.. а ты же Java программист, да?
>по правилам хорошего тона
Дурным тоном считается писать код с UB:)
nyTuH_nugop 30.05.2022 00:27 # 0
ISO 30.05.2022 00:28 # 0
Уж сколько раз твердили миру…
Программа с «UB» не является корректной. «Правила хорошего тона» распространяются только на корректные программы.
Когда поведение определено Стандартом — да, компилятор обязан выдавать функционально идентичные программы вне зависимости от уровня оптимизаций (и компиляторы это делают — с поправкой на различные баги, разумеется).
Когда же ты даёшь компилятору мусор — компилятор выдаёт в ответ мусор. Точка.
Soul_re@ver 30.05.2022 00:39 # +1
У меня сегфолт проявляется выборочно на разных запусках одной и той же программы, потому что иногда говно в памяти указывает на корректную область памяти. Я, может, ожидаю идентичного выхлопа от ОС и железа, который не будет менятся в зависимости от фазы луны, но, если подаёшь на вход говно, получаешь говно.
guest6 30.05.2022 01:54 # 0
То есть либо ты пишешь по стандарту и по модели памяти, либо завязываешься на фазу луны
nyTuH_nugop 30.05.2022 02:44 # +1
bormand 03.09.2022 10:23 # 0
Не совсем. Идентичность выхлопа ожидается только на наборах данных, на которых не триггерится UB. Остальные случаи не имеют смысла и не рассматриваются.
bormand 03.09.2022 10:32 # −1
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
Hoejijtsev 03.09.2022 19:53 # 0
kcalbCube 29.06.2022 09:32 # 0
будь здоров
nyTuH_nugop 30.05.2022 00:09 # 0
Как на ideone опции копулятора подергать?
nyTuH_nugop 30.05.2022 00:15 # 0
guest6 30.05.2022 02:07 # +1
https://habr.com/ru/company/beelinekz/blog/667878/
Джава очень удобный язык, даже 17-тилетний парень может стать сенёром
Зачем вы пишете на своем сложном си??
guest6 30.05.2022 02:20 # 0
guest6 30.05.2022 02:26 # 0
guest6 30.05.2022 08:29 # 0
nyTuH_nugop 30.05.2022 16:42 # 0
guest6 30.05.2022 16:46 # 0
guest6 30.05.2022 16:47 # 0
guest6 30.05.2022 16:49 # 0
guest6 30.05.2022 16:52 # 0
guest6 30.05.2022 16:55 # 0
kcalbCube 02.09.2022 07:09 # 0
kcalbCube 29.06.2022 09:35 # 0
Support 30.05.2022 17:31 # +1
guest6 31.05.2022 15:49 # −2
Support 03.06.2022 13:02 # +1
Steve_Brown 03.06.2022 14:19 # 0
"очевидно же, здесь UB"
"Правильный ответ: поведение не определено."
Ну или, если вопрос "угадайте", то есть "угадайте, что выведет код в некоторых условиях, которые находятся по ссылке", то первый коммент:
"Выведет ко-ко-ко.". Потому что иначе зачем эта строчка.
ucnaHckuu_CTblD 03.06.2022 16:05 # +3
Причем только в консольи. В обычной, нормальной проге с гуем был бы заведомый вылет либо мусор на выхлопе. А тут - 0. Ниль, блять, ниль. Кто его занилил и зачем?
Steve_Brown 03.06.2022 16:44 # 0
guest6 03.06.2022 16:46 # 0
Steve_Brown 03.06.2022 19:06 # +2
Еще бы знать всех уёбков, а то иногда отвечаешь на нормальный комментарий, а тебе говорят, что ты пиздишь с уёбком, педофилом и дельфистом из Осетии и не соблюдаю cancel-культуру. А я взрослый дядя и крестовик-насильник из России - жаль! если бы я был маленьким мальчиком из Осетии, я бы попросил его тоже научить меня программировать на дельфи.
3.14159265 03.06.2022 19:36 # +2
Цитата из неизданных трудов Ницше?
kcalbCube 03.06.2022 18:19 # 0
Support 03.06.2022 20:16 # 0
Support 03.06.2022 16:09 # 0
"Правильный ответ: поведение не определено."
Да ну на хуй! А мы тут пыжимся, хуячим, изображаем знатоков.