|
Самая дорогая однобайтовая ошибка., Просто интересная статья)) |
|
|
|
Aug 18 2011, 03:55
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (sigmaN @ Aug 18 2011, 08:15)  За статью большое спасибо! Однако, позволю предположить, что есть ошибки и подороже. О buffer overflow известно многим. Это значит, такие ошибки можно исключить. Кто не знает о buffer overflow, тот может не знать различия между uint8_t и int8_t. Правильно? Поэтому, необходимо понимать, что подводных камней везде хватает, и ступать по речке следует осторожно)))
--------------------
Выбор.
|
|
|
|
|
Aug 18 2011, 09:58
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 25-07-11
Пользователь №: 66 407

|
Но назвать это ошибкой - язык не поворачивается. Всего лишь - вариант реализации, со своими плюсами/минусами. Ничем не хуже любого другого варианта. Добавление команд в процессор для поддержки таких строк тоже никак не тянет на большие экономические затраты из-за решения какого-то там человека 20 лет назад. За это время кучу процессоров выпустили с новыми командами, и выделять отсюда команды для работы со строками не стоит. А дырки в безопасности - это от программистов зависит.
Сообщение отредактировал whiteTigr - Aug 18 2011, 09:59
|
|
|
|
|
Aug 18 2011, 10:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
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() со товарищи....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2011, 10:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата Наилучшим примером, который я смог найти, является использование NUL-завершенных текстовых строк в C/Unix/Posix. Стоял очень простой выбор: должен ли язык C представлять строки как кортеж адрес + длина или просто как адрес и некий магический символ (NUL), отмечающий конец строки? Из этого пассажа становится совершенно очевидно что автор не программист, независимо от того чем он зарабатывает себе на жизнь. В языке С никаких строк вообще не было и нет по сей день. Вся статья буллшит, за исключением благой вести что по крайней мере один человек достиг-таки просветления: Цитата Они требуют, чтобы программист тщательно следил за тем, что исходный код точно описывает то, что необходимо. и теперь, надо полагать, тщательно следит.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 19 2011, 04:23
|

Местный
  
Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594

|
Цитата(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"
|
|
|
|
|
Aug 19 2011, 13:07
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Автор статьи - упоротый паскальщик. Автор статьи вообще мало что понимает в этих самых компьютерах. QUOTE При использовании NUL-завершенной строки, попытка работы с ней частями, превышающими один байт, может привести к обращению к символам за символом NUL. Если NUL символ является последним байтом страницы виртуальной памяти и следующая страница не определена, это может привести к крушению процесса с ошибкой «страница не найдена» [«page not present»]. "Отличный" пример. А то, что адрес блока (например, для загрузки пачки регистров, в которых потом колдовским кодом (v - 0x01010101UL) & ~v & 0x80808080UL ищется \0) надо выравнивать с точностью до количества этих регистров нет ума сообразить?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|