Как стать автором
Обновить

Комментарии 19

«Ассемблер опасен».
«Как обезопасить» — долгий и трудный путь!
:-)

Спойлер!!

КДПВ соответствует статье. Привлекает внимание, но по существу ничего нет. А если ближе рассмотреть то посевы бактерий симметричные и складки на желтом тоже.
Вот интересно. Это свое выступление он закончил словами «Всегда Ваш, КЭП.»? :D
Или это статья такая?
Или перевод?
Лучший способ использования небезопасным инструментом — не пользоваться им, если это возможно.

Т.е. если у вас кроме C и ассемблера ничего нет и не будет, тогда нужны правильные процессы, анализаторы, верификаторы, санитайзеры и прочий остальной тулинг, а сами вы должны быть готовы писать по 50 строк в день и защищать на ревью каждую строку.

Не хотите? Используйте более безопасные инструменты, оставив С тем, кому от него деваться некуда.
Статья уровня школьного реферата, уж простите.
Я тоже думал, будет объемная статья с разбором MISRA C или подобного, а тут вообще вода.

Си в опасности, это понятно. А как его обезопасить, про это в статье ни слова. Продолжение будет?

Си это кросплатформенный ассемблер!
Проблемы «небезопасности» Си связаны с набежавшей в эту область школотой, которая не писала ни на одном ассемблере.
Отсюда основное правило написания кода на Си: «Пиши так, чтобы не сомневаться как конструкция будет преобразована машинный код. Если за строкой Си-кода не видишь машинных инструкций — не пиши такую строку!»

В нашем современном мире мы стали забывать что a=b[i]; означает — адрес «b» загрузить в индексный регистр, прибавить к содержимому регистра значение по адресу «i» умноженное (бинарно сдвинутое влево) на размер типа «b». Значение по адресу содержимого индексного регистра записать по адресу «a». Если вы будите видеть этот текст за «a=b[i];» проблем с безопасностью языка Си у вас не будет!

что a=b[i]; означает — адрес «b» загрузить в индексный регистр, прибавить к содержимому регистра значение по адресу «i» умноженное (бинарно сдвинутое влево) на размер типа «b».

Муахаха. А на деле может быть что угодно — если вы итерируетесь по массиву, на каждом шаге мы можем просто прибавлять к указателю смещение. И оптимизирующий компилятор может делать что угодно, если результат — тот же.
Не надо цепляться к словам! Он сделает именно это, в той или иной форме. Может вместо индексного регистра будет использован супериндексный суперрегистр с суперинкрементом итп.
Оптимизирующий компилятор должен делать то, что я ему приказал. Иначе он не компилятор. Не умеешь приказывать, пиши на питоне.
Стоп-стоп-стоп, вы уж определитесь — то ли С — кроссплатформенный ассемблер и вы точно должны знать, что и как происходит, цитата:
Пиши так, чтобы не сомневаться как конструкция будет преобразована машинный код.

то ли «в той или иной форме». Форма может быть самая разная, гарантируется только абстрактный результат — на то он и ЯВУ.
Люди хотят математической простоты и работать с алгоритмами, а не думать правильно ли этот алгоритм будет трактоваться на конкретном железе. Раньше реализация была очень важна поскольку вашему отделу в институте выделили 2 часа работы с компьютером и ошибиться значит ждать еще неделю свои 2 часа.
GCC в режиме агрессивной оптимизации вовсе берега теряет. Не спасают даже переменные с коротким жизненным циклом (одноразовые). По этому говорить о какой-либо безопасности просто глупо. GCC вполне может заоптимизировать до нуля код проверки условий — если посчитает что от его наличия или отсутствия ничего не измениться.
Ничего он не теряет. А чтобы не оптимизировал условия использовать модификатор volatile.

Я всего один раз столкнулся с «небезопасностью», и то по собственному незнанию архитектуры процессора. Иар на Кортекс-М0 на высокий скоростных оптимизациях выравнивает переменные, в даже в структурах, на 4 байта. Решается через прагму.
Как оказывается, видеть машынные инструкции уже не достаточно (а может и смысла не имеет): С — не низкоуровневый язык
В 21 стандарте с++ собираются скрыть указатели, мне кажется язык от этого много потеряет.
Наверное, я чего то не знаю, но как VLA может уменьшить производительность вообще, и по сравнению с malloc в частности, я даже представить не могу.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории