LINUX.ORG.RU
ФорумTalks

Linux для параноика :)


0

0

Переполнения буффера были и остаются частью нашей жизни. Уж сколько раз твердили миру, а мир всё пишет на C/C++.

Так вот, мне интересны техники исключения небезопасностей C++. А именно, переполнения буффера и висячие указатели, хотя бы эти источники ошибок. Меня интересуют компиляторы, виртуальные машины C++ и т. д., в которых выполнить подобную операцию было бы невозможно. В идеале -- пересобрать какой-нибудь популярный дистр этим компилятором. Но это вряд ли, как-то нереально звучит, поэтому топик в Talks. Это было бы полезно не только для безопасности юзера, но и для улучшения кода. Ошибки, которые могут быть не видны при исполнении в обычном режиме, не проскочат в режиме защищённом. Соответственно, можно слать баг-репорты куда надо. Это лучше, чем просто надеяться на авось^Wмиллион пытливых глаз.

Конечно, это падение производительности и другие затраты. Скажем, трёхкратное падение производительности на Core 2 Duo можно позволить. Просто очень хочется.


Ответ на: комментарий от true

>Если оно определяется в рантайме, значит его можно сохранить где-то, и использовать сохраненное значение в проверяльщике.

для этого надо переписать _все_ функции всех библиотек. И передавать кроме указателя ещё и размер. И про арифметику указателей придется забыть

geek ★★★
()
Ответ на: комментарий от geek

>для этого надо переписать _все_ функции всех библиотек. И передавать кроме указателя ещё и размер.

Надо просто привязывать указатель к переменной, а не к ячейке памяти.

true
()
Ответ на: комментарий от true

>Надо просто привязывать указатель к переменной, а не к ячейке памяти.

тебе в сторону .NET :)

geek ★★★
()
Ответ на: комментарий от geek

> для этого надо переписать _все_ функции всех библиотек. И передавать кроме указателя ещё и размер. И про арифметику указателей придется забыть

Да нет, жирные указатели арифметику прекрасно позволяют делать. Все функции переписывать не надо, достаточно изменить те места, где выделяется и освобождается память.

Правда, как устроить эти жирные указатели (ЖУ, термин из языка Cyclone), ещё вопрос, однозначного решения нет.

Затравкой для ЖУ обычно является структура из указателя, его min и max. Далее, в качестве модификации можно вместо трёх указателей иметь три смещения, и ещё одним членом структуры handle на домен памяти, в котором всё расположено. Или три указателя, но оставить handle для проверки, а не освободилась ли эта память. Или вообще отслеживать граф ссылок. С разной степенью эффективности, но эта задача решаема.

Nihilist
() автор топика
Ответ на: комментарий от Nihilist

>Да нет, жирные указатели арифметику прекрасно позволяют делать. Все функции переписывать не надо, достаточно изменить те места, где выделяется и освобождается память.

а те-же strcmp будут телепатически узнавать - сколько выделено и где можно ползать? :)

geek ★★★
()
Ответ на: комментарий от geek

> а те-же strcmp будут телепатически узнавать - сколько выделено и где можно ползать? :)

А в этом и смысл жирного указателя. В нём информация, на что сейчас указывает и пределы, в которых можно его [указатель] менять.

Как и другие функции, они не смогут выползти, если будут соблюдать принципы жирных указателей.

Nihilist
() автор топика
Ответ на: комментарий от Nihilist

>Как и другие функции, они не смогут выползти, если будут соблюдать принципы жирных указателей.

для этого эти функции придется _переписывать_.

Иначе при попытке угадать, что имел ввиду программер под конкретной арифметической операцией на указателе - транслятор будет генерить нерабочий код.

geek ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.