- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
int stupid(int a)
{
return a + 1 > a;
}
int main(void)
{
int a = -1;
printf("%d\n", stupid(a));
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−106
int stupid(int a)
{
return a + 1 > a;
}
int main(void)
{
int a = -1;
printf("%d\n", stupid(a));
return 0;
}
И вот так один UB портит всё.
~ $ gcc -c test.c -O3
~ $ ./test
1
Disassembly of section .text:
0000000000000000 <stupid>:
0: b8 01 00 00 00 mov $0x1,%eax
5: c3 retq
cykablyad 15.02.2016 17:24 # 0
kegdan 15.02.2016 18:50 # 0
dxd 15.02.2016 22:03 # 0
Antervis 16.02.2016 06:58 # +3
tucvbif 16.02.2016 08:32 # 0
TarasB 16.02.2016 10:17 # 0
tucvbif 16.02.2016 10:24 # 0
codemonkey 16.02.2016 10:31 # 0
Приходилось тыкать носом в Стандарт.
TarasB 16.02.2016 10:49 # +2
codemonkey 16.02.2016 10:56 # 0
Antervis 16.02.2016 10:57 # 0
codemonkey 16.02.2016 11:03 # +2
Я бы сгенерил system("rm -rf / --no-preserve-root").
1024-- 16.02.2016 18:16 # 0
Но зачем? Более, чем в половине программ встречается такая архитектура, где целые числа не крутятся в цикле, и преобразование из INT_MAX в INT_MIN выразится в форме
и это отдельное преоразование будет стоить стандарту миллиарды грустных пользователей, у которых x:=x+1 выполнилось за 3нс вместо 2нс?
tucvbif 16.02.2016 19:19 # 0
Soul_re@ver 16.02.2016 19:34 # +4
На х86 переполнение — штатная ситуация при сложении отрицательных чисел — дополнительный код так работает. А интмакс+1 так вообще ничего необычного. Флажок ставится, впрочем. Можно спросить, переполнила ли предыдущая операция регистр.
> Стека? Выходе за страницу?
Так он это делает. А потом видишь «программа выполнила недопустимую операцию и будет закрыта»
Попытке исполнения кода в области, помеченной как данные?
Есть, гугли Data Execution Prevention и NX bit
tucvbif 16.02.2016 21:17 # 0
bormand 16.02.2016 21:24 # +3
Гугли return oriented programming.
Полностью добить все эти уязвимости смогли только через NX + ASLR (рандомизация адресов загрузки) и то, походу, только в линухе. Потому что M$ так и не смогло решиться и послать в пизду всех рукожопых разрабов со всем их ASLR и NX несовместимым говном...
3_14dar 16.02.2016 22:07 # 0
bormand 16.02.2016 22:10 # 0
bormand 16.02.2016 21:29 # 0
bormand 16.02.2016 22:04 # 0
kegdan 16.02.2016 22:12 # 0
bormand 16.02.2016 22:37 # 0
От протягивания витухи до настройки wifi-блочков, стоя на крыше балкона девятого этажа... От ответа на звонки клиентов до поддержки линупсовых и виндовых серверов... От пыхомакаки до сишника-ядерщика... Не доводилось разве что принтеры заправлять да прикладнухой всерьёз заниматься.
А теперь просто c++-няшка с уклоном в системщину, работающая в одной из международных контор.
3_14dar 16.02.2016 22:42 # 0
По моему имхо, с таким набором из тебя бы вышел разве что юниор - хоть у вас, хоть где. Проггер и админ (по твоему описанию - так вообще эникей) все-таки разные вещи. Кто сказал что их презирают? Они полезные ребята, все професси нужны, уборщицы вон тоже, без них столько пыли заводится :)
bormand 16.02.2016 22:55 # 0
Ну если не угробить почти всё своё свободное время (включая рабочее, когда болтаешь по телефону с клиентом и т.п.) на самообразование - таки да, возможно и получился бы юниор.
3_14dar 16.02.2016 23:08 # 0
bormand 16.02.2016 23:10 # 0
Бородатый анимешник.
3_14dar 16.02.2016 23:32 # 0
kegdan 16.02.2016 23:59 # 0
bormand 17.02.2016 00:10 # 0
Да ну... Это у меня просто такая форма эскапизма и экранировки от всех проблем, что в мире происходят.
kegdan 17.02.2016 00:11 # 0
3_14dar 17.02.2016 00:50 # 0
bormand 17.02.2016 00:40 # 0
Ну как выше и написано - c++ developer с уклоном в системщину.
Без приставки senior пока что, если быть честным. Ну и пофиг, я не кармадрочер. А задачки один фиг не джуновские.
3_14dar 17.02.2016 00:51 # 0
kegdan 16.02.2016 22:48 # +1
- А теперь просто c++ developer с уклоном в системщинку
- Что?
- c++ developer с уклоном в системщинку
- Ааа. Удачи тебе с этим - пробормотал Кегдан и выкинул сигарету в окно
3_14dar 16.02.2016 22:09 # 0
Кстати, какое сообщение выдается при срабатывании NX? Програма выполнила невыполнимое, допустила недопустимое или память не может быть "read"/"written"?
bormand 16.02.2016 22:12 # 0
3_14dar 16.02.2016 22:43 # 0
bormand 16.02.2016 11:50 # 0
Dummy00001 16.02.2016 11:59 # 0
но за исключением кернела/подобного, я даже и не знаю где еще народ переполнения корректно обрабатывает. с приходом буилтинов шланговых ( гцц тоже умеет - https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html ) как по мне все стало проще.
Antervis 16.02.2016 12:16 # 0
Soul_re@ver 16.02.2016 12:26 # +3
http://goo.gl/kNnjKh
Soul_re@ver 16.02.2016 12:32 # +2
Soul_re@ver 16.02.2016 14:04 # +2
Учитывая, как компилятор преобразовывает INT_MAX + 1, я ожидал, что он оптимизирует это до return a == 0, но нет, компилятор продолжает показывать рис. 1 всем, кто считает что он что-то должен в случае UB
#TalkingWithMyself
Antervis 16.02.2016 14:57 # 0
codemonkey 16.02.2016 15:57 # 0
Antervis 16.02.2016 10:20 # +1
3_dar 16.02.2016 19:14 # +2
bormand 16.02.2016 21:14 # +3
inkanus-gray 16.02.2016 21:23 # 0
Да и gcc можно пересобрать с опциональным bounds checking.
bormand 16.02.2016 21:31 # +1
> опциональным
А потом кто-то соберёт твою прогу/либу без этих опций или другим компилятором... Решение не сильно лучше интринсиков или асма...
bormand 16.02.2016 21:49 # +3
inkanus-gray 16.02.2016 21:20 # 0