Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Самая дорогая однобайтовая ошибка.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
halfdoom
Это его (автора), наверное, еще потряхивает после разработки sbuf'ов для FreeBSD. За качество перевода статьи жирная двойка.
haker_fox
QUOTE (sigmaN @ Aug 18 2011, 08:15) *

За статью большое спасибо!
Однако, позволю предположить, что есть ошибки и подороже.
О buffer overflow известно многим. Это значит, такие ошибки можно исключить.
Кто не знает о buffer overflow, тот может не знать различия между uint8_t и int8_t. Правильно? Поэтому, необходимо понимать, что подводных камней везде хватает, и ступать по речке следует осторожно)))
zltigo
Фантастически тупая статья статья да еще с поганейшим переводом. Что-то уровне женских журналов обсасывающих глобальные проблемы вроде прыщика на ягодице или журналов для таких-же таких-же прыщавых "хакеров". При этом на полном серьезе предлагается "альтернатива" ДЛЯ ВСЕХ ПЛАТФОРМ новый (а для некоторых архитектур и кучу новых указателей эквивалентных near/far/....) указатель. При этом, самое смешное, автор полагает длину строки в 255 байт совершенно достаточной. А о, например, НЕ однобайтовых фориатах и кодировках (в 21веке!) и не подозревает.
svss
Маленькие дырки в безопасности кода заставляют думать.
Автор статьи и автор темы - двое из них. Чего ж плохого?
whiteTigr
Но назвать это ошибкой - язык не поворачивается.
Всего лишь - вариант реализации, со своими плюсами/минусами. Ничем не хуже любого другого варианта.
Добавление команд в процессор для поддержки таких строк тоже никак не тянет на большие экономические затраты из-за решения какого-то там человека 20 лет назад. За это время кучу процессоров выпустили с новыми командами, и выделять отсюда команды для работы со строками не стоит.
А дырки в безопасности - это от программистов зависит.
zltigo
QUOTE (svss @ Aug 18 2011, 11:45) *
Маленькие дырки в безопасности кода заставляют думать.
Автор статьи и автор темы - двое из них. Чего ж плохого?

Плохое именно то, что статья совершенно БЕЗДУМНАЯ, когда взят один из аспектов проблемы и бездумно ОТБРОШЕНЫ все остальные. Ах, как хорошо знать длину строки сразу, ах, как это-бы помогло может быть иногда чего-то улучшить, ах это слово "безопасность", ах..... Если ах, то кто кому мешает создавать свои ЛЮБЫЕ представления текстовых строк? Си в этом совершенно демократичен - да он вообще практически ничего о строках не знает, кроме, пожалуй встроенного типа указателя на одно из возможных представлений строки. Все строки в библиотеках - хочешь пользуй, хочешь пиши свои "правильные". Хочешь указатель содержащий размер - да какие проблемы? Опиши и пользуй, пока не надоест. Отцы основатели НЕ запрещают. В чем ошибка и вина Авторов языка? Если кому-то нужно массово и БЕЗДУМНО работать со строками, то зачем для этого вообще Си использовать? Для работы со строками и текстами предназначены другие языки. Вот я прямо сегодня писал на языке достаточно заточенном под обработку строк:
CODE
        if( Val( ErrLine, Remove_Space( Get_Word( ":" ) ) ) == 0 )
        {       
             ++g_compiler_err_cnt;
             Return_Str = Find_Error(  "/NL=0/F=" + FName + "/L=" + Str(ErrLine)  );
        }

Ни тебе strlen() ни прочих strcat() со товарищи....
SSerge
Цитата
Наилучшим примером, который я смог найти, является использование NUL-завершенных текстовых строк в C/Unix/Posix. Стоял очень простой выбор: должен ли язык C представлять строки как кортеж адрес + длина или просто как адрес и некий магический символ (NUL), отмечающий конец строки?

Из этого пассажа становится совершенно очевидно что автор не программист, независимо от того чем он зарабатывает себе на жизнь.
В языке С никаких строк вообще не было и нет по сей день.
Вся статья буллшит, за исключением благой вести что по крайней мере один человек достиг-таки просветления:
Цитата
Они требуют, чтобы программист тщательно следил за тем, что исходный код точно описывает то, что необходимо.

и теперь, надо полагать, тщательно следит.
sasamy
Цитата(SSerge @ Aug 18 2011, 14:28) *
В языке С никаких строк вообще не было и нет по сей день.


Тем не менее в стандарте языка есть описание ф-ций работы со строками ;-) Автор статьи - упоротый паскальщик.
zltigo
QUOTE (sasamy @ Aug 18 2011, 19:32) *
Автор статьи - упоротый паскальщик.

Нет sad.gif. Обычный юниксоид ( FreeBSD-шник) сваливший в одну кучу язык 'C', UNIX системы и свои собственные частные проблемы sad.gif
Вообще-то и в Паскале нет типа хранящего адрес+размер. Хранение-же размера в первом байте строки это не то, что Автор считает хорошим решением.
Allregia
Цитата
Вообще-то и в Паскале нет типа хранящего адрес+размер

Зато в Паскале (Дельфи) есть сишные null-terminated string, а в C++Билдере есть паскалевские AnsiString.
_Pasha
Цитата
IBM добавила инструкции для работы с NUL-завершенными строками потому, что..

Потому,что выход АЛУ "==0" уже был. Мегалол.
svss
Цитата(SSerge @ Aug 18 2011, 17:28) *
В языке С никаких строк вообще не было и нет по сей день.
Что Вы имели в виду, интересно?

Цитата(ISO/IEC 9899:1999)
6.4.5 String literals


Нули на конце строки действительно, якобы, - не часть языка, но свойство компилятора, однако и оно, это свойство, заковано в стандарт:
Цитата(ISO/IEC 9899:1999)
6.4.5.5
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals.


Или у отцов-основателей:
Цитата(Kernighan & Ritchie)
2.3
A string constant, or string literal, is a sequence of zero or more characters surrounded by
double quotes, as in "I am a string"
Rst7
QUOTE
Автор статьи - упоротый паскальщик.


Автор статьи вообще мало что понимает в этих самых компьютерах.

QUOTE
При использовании NUL-завершенной строки, попытка работы с ней частями, превышающими один байт, может привести к обращению к символам за символом NUL. Если NUL символ является последним байтом страницы виртуальной памяти и следующая страница не определена, это может привести к крушению процесса с ошибкой «страница не найдена» [«page not present»].


"Отличный" пример. А то, что адрес блока (например, для загрузки пачки регистров, в которых потом колдовским кодом (v - 0x01010101UL) & ~v & 0x80808080UL ищется \0) надо выравнивать с точностью до количества этих регистров нет ума сообразить?
sigmaN
Ухх!
Не ожидал, что статья вызовет такую дискуссию.
Очень рад, что всем понравилось ))
svss
Цитата(sigmaN @ Aug 20 2011, 02:42) *
Ухх!
Не ожидал, что статья вызовет такую дискуссию.
Очень рад, что всем понравилось ))

холивар жив!
К сожалению ни аффтар статьи, ни половина дискутёров не разобрались
с сутью безопасности кода.
Нуль на конце плох не тем, что сервис "упадёт", а тем, что злоумышленник
может незаметно внедрить свой малварь на место того нуля.
Уважаемым имбеддерам то не грозит, потому оне не ведают, а между тем
у всеми любимого луниха есть проблема, которую маздай умеет решать
(правда болшой кровею). Время рассудит.
zltigo
QUOTE (svss @ Aug 19 2011, 23:00) *
ни половина дискутёров не разобрались
с сутью безопасности кода.

Я Вас умоляю, не надо нести в массы "откровения" почерпнутые в глянцевых журналах для малолетних "хакеров".
svss
Цитата(zltigo @ Aug 20 2011, 03:07) *
Я Вас умоляю, не надо нести в массы "откровения" почерпнутые в глянцевых журналах для малолетних "хакеров".

Кому что нравится, тот о том и. Я читаю MSDN.
sigmaN
Почему это
Цитата
Уважаемым имбеддерам то не грозит, потому оне не ведают
???
Не, ну канеш если это вброс такой - тогда понятно. Вопросов нет.

Вы уж простите, но кажется вам подсунули какой-то неправильный MSDN. Там просто таки целый список нулл терминэйтэд функций найти можно...
В общем слабоват вброс... Никуда не гдиццо ))
haker_fox
QUOTE (svss @ Aug 20 2011, 05:00) *
Уважаемым имбеддерам то не грозит, потому оне не ведают,.

Еще как грозит rolleyes.gif Микроконтроллеры могут код из ОЗУ выполнять laughing.gif
svss
Цитата(sigmaN @ Aug 20 2011, 03:23) *
нулл терминэйтэд функций найти можно... В общем слабоват вброс...

(Да, от обиды, говорят мыльные пузыри лопаются..) Это я не Вам, так - к слову.
Переведите, пожалуйста, если можете, на человеческий язык "нулл терминэйтед функций" - и ладно.

Я, собственно, зашёл сюда поглядеть, не придумал ли SSerge причину, отчего в языке может не быть строк.
Молчит, стало быть, тоже обижается. А ведь есть ответ - слово из трёх букв.


Так вот, WDM прямо требует не использовать текстовые строки.
(Кто не знает, исходники WDM/WDF драйверов - процентов на 70 - C/C++)
Вместо языковых строковых констант используется макро UNICODE_STRING


Что до имбеддеров (haker_fox меня понял, спасибо), то я им был, я их есть и, даст Бог,
какое-то время буду. По совместительству.
zltigo
QUOTE (svss @ Aug 20 2011, 07:08) *
Вместо языковых строковых констант используется макро UNICODE_STRING

Как особо "продвинутому" читателю MSDN, Вам будет очень полезным знать, что "макро UNICODE_STRING" это не макро, а структура.
Причем эта структура не содержит в себе ни "строковой константы", ни какой-либо строки вообще.
SSerge
Цитата(svss @ Aug 20 2011, 12:08) *
Я, собственно, зашёл сюда поглядеть, не придумал ли SSerge причину, отчего в языке может не быть строк.
Молчит, стало быть, тоже обижается. А ведь есть ответ - слово из трёх букв.

Да разве-ж то строки? sm.gif
Так, инициализаторы массивов, да и те какие-то недоделанные.
sigmaN
Цитата
Переведите, пожалуйста, если можете, на человеческий язык "нулл терминэйтед функций" - и ладно.
ну в смысле принимающих строку с завершающим нулем как параметр ))
777777
Цитата(svss @ Aug 20 2011, 00:00) *
К сожалению ни аффтар статьи, ни половина дискутёров не разобрались
с сутью безопасности кода.

Вы также входите в число этих дискутеров.

Цитата(svss @ Aug 20 2011, 00:00) *
Нуль на конце плох не тем, что сервис "упадёт", а тем, что злоумышленник
может незаметно внедрить свой малварь на место того нуля.

Это называется "слышал звон, да не знаю где он". А если строка будет начинаться с длины, то злоумышленник не может незаметно ее заменить?

Вообще-то суть безопасности кода заключается в некоторых функциях, работающих со строками, которым не передается размер буфера, в которую надо поместить строку. Если буфер будет недостаточным (или злоумышленник передаст достаточно длинную строку), то она затрет память, находящуюся за пределами строки. Если этот буфер для строки выделен в стеке, то подойдя к процессу творчески можно с передаваемой строке передать свой код и затереть адрес возврата таким образом, чтобы управление передалось на этот код.

Но к null-terminated строкам это имеет весьма отдаленное отношение - программист должен проверять поступаемые данные. Это все равно, что обвинять Си в том, что при обращении к массиву он не проверяет, не выходит ли индекс за его пределы.
halfdoom
Цитата(Rst7 @ Aug 19 2011, 16:07) *
Автор статьи вообще мало что понимает в этих самых компьютерах.

Поделитесь копирайтом на фразу? sm.gif Автор широко известен в узких кругах своими безапелляционными заявлениями. А как программист, он вроде и ничего.

Вот выдержка с его домашней страницы.
Цитата
Partial highlights:

Wrote src/release/Makefile
Release engineer for FreeBSD 2.X series
Rewrote the VFS namecache
Cleaned up vnode object model
Usable sysctls
MD5 based password scrambler
Phkmalloc
Jails
Defined sbufs for safe string handling
DEVFS and dynamic device support
GEOM, modular disk transformations.
GBDE , disk encryption you can actually use.
Numerous more or less weird device drivers
Tons of other stuff I've forgotten now


Rst7
QUOTE
А как программист, он вроде и ничего.


Ага-ага. С такими-то заявками.
halfdoom
Ну, дядя в возрасте, может перегрелся.
Rst7
QUOTE
Ну, дядя в возрасте, может перегрелся.


Отож. Лучше уж что-то более годное почитать. Вот, например, рекомендую - http://russian.joelonsoftware.com/index.html
svss
Цитата(zltigo @ Aug 20 2011, 17:15) *
"макро UNICODE_STRING" это не макро

DECLARE_CONST_UNICODE_STRING
DECLARE_UNICODE_STRING_SIZE

Я знаю, что кратко - не всегда ясно. Прошу прощения.
demiurg_spb
Года два назад купил его книгу, созданную по мотивам его же блога.
Да, есть много здравых мыслей. Но в общем и целом скучно, напоминает доктора Курпатова от IT:)
А так мужик молодец! Думаю на книге миллион поднял...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.