- 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
Приходилось тыкать носом в Стандарт.
Я бы сгенерил system("rm -rf / --no-preserve-root").
Но зачем? Более, чем в половине программ встречается такая архитектура, где целые числа не крутятся в цикле, и преобразование из INT_MAX в INT_MIN выразится в форме
и это отдельное преоразование будет стоить стандарту миллиарды грустных пользователей, у которых x:=x+1 выполнилось за 3нс вместо 2нс?
На х86 переполнение — штатная ситуация при сложении отрицательных чисел — дополнительный код так работает. А интмакс+1 так вообще ничего необычного. Флажок ставится, впрочем. Можно спросить, переполнила ли предыдущая операция регистр.
> Стека? Выходе за страницу?
Так он это делает. А потом видишь «программа выполнила недопустимую операцию и будет закрыта»
Попытке исполнения кода в области, помеченной как данные?
Есть, гугли Data Execution Prevention и NX bit
Гугли return oriented programming.
Полностью добить все эти уязвимости смогли только через NX + ASLR (рандомизация адресов загрузки) и то, походу, только в линухе. Потому что M$ так и не смогло решиться и послать в пизду всех рукожопых разрабов со всем их ASLR и NX несовместимым говном...
От протягивания витухи до настройки wifi-блочков, стоя на крыше балкона девятого этажа... От ответа на звонки клиентов до поддержки линупсовых и виндовых серверов... От пыхомакаки до сишника-ядерщика... Не доводилось разве что принтеры заправлять да прикладнухой всерьёз заниматься.
А теперь просто c++-няшка с уклоном в системщину, работающая в одной из международных контор.
По моему имхо, с таким набором из тебя бы вышел разве что юниор - хоть у вас, хоть где. Проггер и админ (по твоему описанию - так вообще эникей) все-таки разные вещи. Кто сказал что их презирают? Они полезные ребята, все професси нужны, уборщицы вон тоже, без них столько пыли заводится :)
Ну если не угробить почти всё своё свободное время (включая рабочее, когда болтаешь по телефону с клиентом и т.п.) на самообразование - таки да, возможно и получился бы юниор.
Бородатый анимешник.
Да ну... Это у меня просто такая форма эскапизма и экранировки от всех проблем, что в мире происходят.
Ну как выше и написано - c++ developer с уклоном в системщину.
Без приставки senior пока что, если быть честным. Ну и пофиг, я не кармадрочер. А задачки один фиг не джуновские.
- А теперь просто c++ developer с уклоном в системщинку
- Что?
- c++ developer с уклоном в системщинку
- Ааа. Удачи тебе с этим - пробормотал Кегдан и выкинул сигарету в окно
Кстати, какое сообщение выдается при срабатывании NX? Програма выполнила невыполнимое, допустила недопустимое или память не может быть "read"/"written"?
но за исключением кернела/подобного, я даже и не знаю где еще народ переполнения корректно обрабатывает. с приходом буилтинов шланговых ( гцц тоже умеет - https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html ) как по мне все стало проще.
http://goo.gl/kNnjKh
Учитывая, как компилятор преобразовывает INT_MAX + 1, я ожидал, что он оптимизирует это до return a == 0, но нет, компилятор продолжает показывать рис. 1 всем, кто считает что он что-то должен в случае UB
#TalkingWithMyself
Да и gcc можно пересобрать с опциональным bounds checking.
> опциональным
А потом кто-то соберёт твою прогу/либу без этих опций или другим компилятором... Решение не сильно лучше интринсиков или асма...