Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, Sorantis, Вы писали:
S>>А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.
AG>Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.
strnlen is not a replacement for strlen; strnlen is only intended to be used to calculate the size of incoming untrusted data in a buffer of known size (such as a network packet). strnlen will calculate the length but not walk past the end of your buffer if the string is unterminated. For other situations, use strlen. (The same applies to wcsnlen, _mbsnlen, and _mbstrnlen.)
Здравствуйте, Alexander G, Вы писали:
AG>Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.
Чтение за границей буфера тоже может быть фатальным
Например, выход из валидного адресного пространства или порча регистров, отображенных на память.
ROP>Например, выход из валидного адресного пространства
И что? Или ничего или упадёт с AV.
ROP>или порча регистров, отображенных на память.
В Win32 ?
ROP>Чтение за границей буфера тоже может быть фатальным
Так или иначе, _s функции, проверяют только размер буфера на запись.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>>Например, выход из валидного адресного пространства AG>И что? Или ничего или упадёт с AV.
ROP>>или порча регистров, отображенных на память. AG>В Win32 ?
Программирование на C++ не ограничивается Win32 или юзермодом
Сам видел как промах в простом printf-е наглухо вешал железку.
Re[4]: [ANN] memcpy() banned
От:
Аноним
Дата:
22.05.09 15:50
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, rus blood, Вы писали:
RB>>Святое — это memset. RB>>memset — это наше все!
К>memset — это наше ваще. Стоит перепутать "сколько байтов" и "чем заполнять", и нас ждёт сурприз!
Упавший модульный тест или замечание на code review это сюрприз? Да и параметры можно не только для memset перепутать, только это очень маловероятно.
ROP>>Сам видел как промах в простом printf-е наглухо вешал железку. AG>А есть ли рантайм с этими memmove_s для железки ?
Компилялось для процессоров tms320c64x / tms320c67x в среде Code Composer.
Было это давно. Был ли там memmove_s — не помню, и это не важно.
Речь шла о промашке в printf...
memcpy меня вполне устраивает.
Здравствуйте, Аноним, Вы писали:
А>Упавший модульный тест
Скорее всего тест отработает нормально
А>или замечание на code review это сюрприз?
Инспектора тоже могут пропустить, особенно если кода много.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Mazay, Вы писали:
M>>Типа юзайте STL уже.
А>Можно подумать, что std::copy с char* чем-то лучше memmove.
Дык std::copy (с такими параметрами) тоже вроде вне закона
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Дык std::copy (с такими параметрами) тоже вроде вне закона
А как тогда литералами рользоваться?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Дык std::copy (с такими параметрами) тоже вроде вне закона E>А как тогда литералами рользоваться?
Я не стал парить себе моск и реализовал свою copy с 4-мя параметрами. Типа
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>>Дык std::copy (с такими параметрами) тоже вроде вне закона E>>А как тогда литералами рользоваться?
КД>Я не стал парить себе моск и...
а я вот ничего не предпринял. когда моя версия студии начнёт ругаться на memmove/memcpy, запрещу ворнинг. ну может посмотрю на memcpy_s
а std::copy для char* некошерно.
если char* — байты, то memmove использует хитрые возможности платформы, которые скорее всего не используются реализацией STL, memcpy же имеет дополнительные возможности оптимизации поверх memmove.
если char* — буквы, то strcpy_s и вообще CString заместо char*.
Здравствуйте, Коваленко Дмитрий, Вы писали:
А>>а std::copy для char* некошерно.
КД>Можно сделать специализацию.
Нельзя сделать специализацию.
17.3.3.1 Reserved names [lib.reserved.names]
1 It is undefined for a C++ program to add declarations or definitions
to namespace std or namespaces within namespace std unless otherwise
specified. A program may add template specializations for any stan-
dard library template to namespace std. Such a specialization (com-
plete or partial) of a standard library template results in undefined
behaviour unless the declaration depends on a user-defined name of
external linkage and unless the specialization meets the standard
library requirements for the original template.20)
А>>вообще CString заместо char*.
КД>А шо это такое — CString? Ни разу за 10 лет не использовал
Ну как Вам объяснить. вот у std::basic_string имеются какие-то size (совпадающий с length) empty (который похож на глагол опустошить), при этом совершенно нет пробразования регистра, регистронезависимого сравнения, возможности _удобно_ получить подстроку с начала/середины/конца, кошерного преобразования "ANSI" <-> Unicode и вообще не понятно, используется ли там подсчёт ссылок, оптимизация малого буфера, или ничего из этого.
CString же не обладает вышеозначенными недостатками, и вполне установленный факт, что он использует подсчёт ссылок. Стандарная строка — стандартная, и поэтому велосипеды широко используются.