The memcpy() function has been recommended to be banned and will most likely enter Microsoft’s SDL Banned list later this year. memcpy() joins the ranks of other popular functions like strcpy, strncpy, strcat, strncat which were banned due to their security vulnerability through buffer overruns.
S>The memcpy() function has been recommended to be banned and will most likely enter Microsoft’s SDL Banned list later this year. memcpy() joins the ranks of other popular functions like strcpy, strncpy, strcat, strncat which were banned due to their security vulnerability through buffer overruns.
S>The memcpy() function has been recommended to be banned and will most likely enter Microsoft’s SDL Banned list later this year. memcpy() joins the ranks of other popular functions like strcpy, strncpy, strcat, strncat which were banned due to their security vulnerability through buffer overruns.
Здравствуйте, rus blood, Вы писали:
RB>Святое — это memset. RB>memset — это наше все!
Давно memset не использовал. Инициализировать нулём предпочитаю через = {0} по возможности. Другие варианты использования редки. А вот memcpy и даже memmove — использую.
S>The memcpy() function has been recommended to be banned and will most likely enter Microsoft’s SDL Banned list later this year. memcpy() joins the ranks of other popular functions like strcpy, strncpy, strcat, strncat which were banned due to their security vulnerability through buffer overruns.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Хороший вопрос. С одной стороны, memmove_s, как и memcpy_s уже есть (смотрю в VS2005). C другой — плохо себе представляю, как она может помочь при типичном случае перемещения "вперёд" в том же буфере.
С третьей — наверное, "маразматики" банят функции по количеству и серьёзности багов. Так тут memmove не догонит memcpy. Во-первых реже нужно копировать в тот же буфер, во-вторых, разработчик более внимателен при таком копировании.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, Sorantis, Вы писали:
S>>список баннд функций.
S>># pragma deprecated (strlen, wcslen, _mbslen, _mbstrlen, StrLen, lstrlen)
AG>Вот это я хочу видеть, как выстрелить себе в ногу через strlen
Ну это только майкрософт так решил. Стандартом не запрещено юзать strlen.
А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.
Здравствуйте, Alexander G, Вы писали:
AG>Вот это я хочу видеть, как выстрелить себе в ногу через strlen
а мне интересно, в каком их коде определен макрос __GNUC__
Здравствуйте, Vamp, Вы писали:
V>Маразм силен. Кроме того, не понимаю, чем strcpy_s лучше strncpy.
это просто разные вещи, strncpy — копируемая строка не влезла в целевой буфер? ну и пофиг, идем дальше; strcpy_s — копируемая строка не влезла в целевой буфер? тушим свет и сливаем воду
S>The memcpy() function has been recommended to be banned and will most likely enter Microsoft’s SDL Banned list later this year. memcpy() joins the ranks of other popular functions like strcpy, strncpy, strcat, strncat which were banned due to their security vulnerability through buffer overruns.
Феерические идиоты!
Надо им внести предложение забанить ассемблерную команду MOV ибо она потенциально опасна.
И шоп новая версия винды при обнаружении в исполняемом файле программы этой жуткой опасной инструкции отказывалась бы его выполнять.
Здравствуйте, Sorantis, Вы писали:
S>А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.
Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.
Здравствуйте, 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 же не обладает вышеозначенными недостатками, и вполне установленный факт, что он использует подсчёт ссылок. Стандарная строка — стандартная, и поэтому велосипеды широко используются.
Re[7]: А memmove?
От:
Аноним
Дата:
26.05.09 12:31
Оценка:
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, Sorantis, Вы писали:
S>>А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.
AG>Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.
легко
void GetUserInput(char *dst_buffer, int max_chars)
{
..
}
void main()
{
char buffer[256+32];
GetUserInput(buffer, 250:
int l = strlen (buffer);
strcat(buffer + l, "stuff less than 32 bytes");
Здравствуйте, Аноним, Вы писали:
А>>>а std::copy для char* некошерно.
КД>>Можно сделать специализацию.
А>Нельзя сделать специализацию.
Вообще говоря, я думал про свою copy, бо решил забить на std::copy после перехода на VS2005
А>>>вообще CString заместо char*.
КД>>А шо это такое — CString? Ни разу за 10 лет не использовал
А>Ну как Вам объяснить. вот у std::basic_string имеются какие-то ....
Да не надо ничего объяснять. Это я так
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, Аноним, Вы писали:
А>>Упавший модульный тест AJD>Скорее всего тест отработает нормально
Ну, я по своей наивности полагал, что вызов memset в коде стоит не просто так, а делает что-то полезное и модульные тесты проверют, что тестируемый код делает то, для чего его писали. Но это, конечно случай, редкий и маловероятный.
А>>или замечание на code review это сюрприз? AJD>Инспектора тоже могут пропустить, особенно если кода много.
А не надо их заставлять ревьюить много кода за малое время, может тогда и польза какая-нибудь от инспекций появится.
Здравствуйте, Аноним, Вы писали:
А>Ну, я по своей наивности полагал, что вызов memset в коде стоит не просто так, а делает что-то полезное и модульные тесты проверют, что тестируемый код делает то, для чего его писали. Но это, конечно случай, редкий и маловероятный.
Просто обычно такой тест короткий, и проблема может не проявится. Ели же тест выполняется часами, в условиях когда оперативки не очень много — тогда да, вероятность проявления очень высока
А>>>или замечание на code review это сюрприз? AJD>>Инспектора тоже могут пропустить, особенно если кода много.
А>А не надо их заставлять ревьюить много кода за малое время, может тогда и польза какая-нибудь от инспекций появится.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[8]: [ANN] memcpy() banned
От:
Аноним
Дата:
27.05.09 18:32
Оценка:
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, Аноним, Вы писали:
А>>Ну, я по своей наивности полагал, что вызов memset в коде стоит не просто так, а делает что-то полезное и модульные тесты проверют, что тестируемый код делает то, для чего его писали. Но это, конечно случай, редкий и маловероятный. AJD>Просто обычно такой тест короткий, и проблема может не проявится. Ели же тест выполняется часами, в условиях когда оперативки не очень много — тогда да, вероятность проявления очень высока
Хорошо, допустим, всё так, но ведь и всякие разные functional, regression и прочие stress тесты никто не отменял. По твоим же словам есть большая вероятность заметить эту ошибку.
Однако, я тем не менее, не могу понять, что мешает модульному тесту обнаружить эту проблему. Это ведь не работа с памятью в чистом C через malloc/free. Это memset, вызов которой должен заполнить кусок памяти некоторым значением. Зачем-то же мы меняем состояние этой памяти? Мы ведь ожидаем от этого какой-либо наблюдаемый эффект? Почему тест этого не проверяет?
Здравствуйте, Аноним, Вы писали:
А>Однако, я тем не менее, не могу понять, что мешает модульному тесту обнаружить эту проблему. Это ведь не работа с памятью в чистом C через malloc/free. Это memset, вызов которой должен заполнить кусок памяти некоторым значением. Зачем-то же мы меняем состояние этой памяти? Мы ведь ожидаем от этого какой-либо наблюдаемый эффект? Почему тест этого не проверяет?
Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
AJD>Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.
попробуй привести пример кода, где описанная тобой ошибка "перепутали порядок параметров memset" легко была бы гн замечена тестом? Я думаю станет понятнее и тебе и оппоненту...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: [ANN] memcpy() banned
От:
Аноним
Дата:
29.05.09 16:42
Оценка:
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, Аноним, Вы писали:
[snip]
AJD>Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.
Я предполагал, что помимо выхода за границы буфера и порчи других объектов будет ещё и отсутсвие нужных действий, что должно сказаться на результатах тестов. Всё таки пример и правда, не помешал бы.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Коваленко Дмитрий, Вы писали:
А>>>а 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 же не обладает вышеозначенными недостатками, и вполне установленный факт, что он использует подсчёт ссылок. Стандарная строка — стандартная, и поэтому велосипеды широко используются.
size/length — ну кто вам виноват что вы не изучали достаточно стандартную библиотеку — вот подучили бы и не путались бы больше. Это же касается и глагола empty. Преобразование регистра — std::use_facet<std::ctype<char> >( yourLocale ).tolower(/*...*/). Что касается преобразований регистра — не забывайте что оно локалезависимое, т.е. в use_facet вы указываете локаль, а CString скорее всего берёт текущую для треда. Вообще не фан CString как и всего MFC в целом. А чем вам кстати не удобен способ с substr методом? Религия не позволяет? С конца надо? rbegin + std algorithms. По поводу кошерного преобразования ANSI -> Unicode, опять же курить фасеты — std::use_facet. А в случае linux приложений или представьте себе что даже QNX бывают — где брать CString? Неужто вешаццо? А представьте себе что существует ещё Borland C++ Builder, Intel C++ compiler и ещё много чего интересного.