Re: [ANN] memcpy() banned
От: Шахтер Интернет  
Дата: 21.05.09 16:04
Оценка: 1 (1) +4 -3
Здравствуйте, Sorantis, Вы писали:


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.


S>здесь


Маразм крепчает.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
[ANN] memcpy() banned
От: Sorantis Швеция  
Дата: 21.05.09 15:56
Оценка: +1 :))) :)))

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.


здесь
As long as there is life, there is hope
Re: В тему пост из КСВ
От: Alexander G Украина  
Дата: 22.05.09 08:51
Оценка: 1 (1) +1 :)))
http://www.rsdn.ru/forum/message/3257463.1.aspx
Автор: VCoder
Дата: 21.01.09
Русский военный корабль идёт ко дну!
Re[6]: [ANN] memcpy() banned
От: Аноним  
Дата: 26.05.09 15:23
Оценка: +2 :))
Здравствуйте, AndrewJD, Вы писали:

AJD>Здравствуйте, Аноним, Вы писали:


А>>Упавший модульный тест

AJD>Скорее всего тест отработает нормально

Ну, я по своей наивности полагал, что вызов memset в коде стоит не просто так, а делает что-то полезное и модульные тесты проверют, что тестируемый код делает то, для чего его писали. Но это, конечно случай, редкий и маловероятный.

А>>или замечание на code review это сюрприз?

AJD>Инспектора тоже могут пропустить, особенно если кода много.

А не надо их заставлять ревьюить много кода за малое время, может тогда и польза какая-нибудь от инспекций появится.
Re: [ANN] memcpy() banned
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 21.05.09 17:02
Оценка: :)))
Здравствуйте, Sorantis, Вы писали:


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.

S>здесь

Ничего святого для них нет. Изверги
Re: [ANN] memcpy() banned
От: carpenter Голландия  
Дата: 22.05.09 07:07
Оценка: +3
Здравствуйте, Sorantis, Вы писали:

типа — пишите на шарпе уже ?
Весь мир — Кремль, а люди в нем — агенты
Re[3]: А memmove?
От: Sorantis Швеция  
Дата: 21.05.09 19:53
Оценка: 17 (2)
список баннд функций.

/***
* banned.h - list of Microsoft Security Development Lifecycle banned APIs
*
* Purpose:
*       This include file contains a list of banned API which should not be used in new code and 
*       removed from legacy code over time
* History
* 01-Jan-2006 - mikehow - Initial Version
* 22-Apr-2008 - mikehow    - Updated to SDL 4.1, commented out recommendations and added memcpy
*
***/

#ifndef _INC_BANNED
#    define _INC_BANNED
#endif

#ifdef _MSC_VER
// Some of these functions are Windows specific
#    pragma once
#    pragma deprecated (strcpy, strcpyA, strcpyW, wcscpy, _tcscpy, _mbscpy, StrCpy, StrCpyA, StrCpyW, lstrcpy, lstrcpyA, lstrcpyW, _tccpy, _mbccpy)
#    pragma deprecated (strcat, strcatA, strcatW, wcscat, _tcscat, _mbscat, StrCat, StrCatA, StrCatW, lstrcat, lstrcatA, lstrcatW, StrCatBuff, StrCatBuffA, StrCatBuffW, StrCatChainW, _tccat, _mbccat)
#    pragma deprecated (wnsprintf, wnsprintfA, wnsprintfW, sprintfW, sprintfA, wsprintf, wsprintfW, wsprintfA, sprintf, swprintf, _stprintf, _snwprintf, _snprintf, _sntprintf)
#    pragma deprecated (wvsprintf, wvsprintfA, wvsprintfW, vsprintf, _vstprintf, vswprintf)
#    pragma deprecated (_vsnprintf, _vsnwprintf, _vsntprintf, wvnsprintf, wvnsprintfA, wvnsprintfW)
#    pragma deprecated (strncpy, wcsncpy, _tcsncpy, _mbsncpy, _mbsnbcpy, StrCpyN, StrCpyNA, StrCpyNW, StrNCpy, strcpynA, StrNCpyA, StrNCpyW, lstrcpyn, lstrcpynA, lstrcpynW)
#    pragma deprecated (strncat, wcsncat, _tcsncat, _mbsncat, _mbsnbcat, StrCatN, StrCatNA, StrCatNW, StrNCat, StrNCatA, StrNCatW, lstrncat, lstrcatnA, lstrcatnW, lstrcatn)
#    pragma deprecated (strtok, _tcstok, wcstok, _mbstok)
#    pragma deprecated (makepath, _tmakepath,  _makepath, _wmakepath)
#    pragma deprecated (_splitpath, _tsplitpath, _wsplitpath)
#    pragma deprecated (scanf, wscanf, _tscanf, sscanf, swscanf, _stscanf, snscanf, snwscanf, _sntscanf)
//#    pragma deprecated (_itoa, _itow, _i64toa, _i64tow, _ui64toa, _ui64tot, _ui64tow, _ultoa, _ultot, _ultow)
#    pragma deprecated (gets, _getts, _gettws)
#    pragma deprecated (IsBadWritePtr, IsBadHugeWritePtr, IsBadReadPtr, IsBadHugeReadPtr, IsBadCodePtr, IsBadStringPtr)
#    pragma deprecated (CharToOem, CharToOemA, CharToOemW, OemToChar, OemToCharA, OemToCharW, CharToOemBuffA, CharToOemBuffW)
//#    pragma deprecated (alloca, _alloca)
#    pragma deprecated (strlen, wcslen, _mbslen, _mbstrlen, StrLen, lstrlen)
#    pragma deprecated (memcpy, RtlCopyMemory, CopyMemory)
#else 
#ifdef __GNUC__
// Some of these functions are Windows specific, so you may want to add *nix specific banned function calls
#    pragma GCC poison strcpy strcpyA strcpyW wcscpy _tcscpy _mbscpy StrCpy StrCpyA StrCpyW lstrcpy lstrcpyA lstrcpyW _tccpy _mbccpy
#    pragma GCC poison strcat strcatA strcatW wcscat _tcscat _mbscat StrCat StrCatA StrCatW lstrcat lstrcatA lstrcatW StrCatBuff StrCatBuffA StrCatBuffW StrCatChainW _tccat _mbccat
#    pragma GCC poison wnsprintf wnsprintfA wnsprintfW sprintfW sprintfA wsprintf wsprintfW wsprintfA sprintf swprintf _stprintf _snwprintf _snprintf _sntprintf
#    pragma GCC poison wvsprintf wvsprintfA wvsprintfW vsprintf _vstprintf vswprintf
#    pragma GCC poison _vsnprintf _vsnwprintf _vsntprintf wvnsprintf wvnsprintfA wvnsprintfW
#    pragma GCC poison strncpy wcsncpy _tcsncpy _mbsncpy _mbsnbcpy StrCpyN StrCpyNA StrCpyNW StrNCpy strcpynA StrNCpyA StrNCpyW lstrcpyn lstrcpynA lstrcpynW
#    pragma GCC poison strncat wcsncat _tcsncat _mbsncat _mbsnbcat StrCatN StrCatNA StrCatNW StrNCat StrNCatA StrNCatW lstrncat lstrcatnA lstrcatnW lstrcatn
#    pragma GCC poison strtok _tcstok wcstok _mbstok
#    pragma GCC poison makepath _tmakepath  _makepath _wmakepath
#    pragma GCC poison _splitpath _tsplitpath _wsplitpath
#    pragma GCC poison scanf wscanf _tscanf sscanf swscanf _stscanf snscanf snwscanf _sntscanf
//#    pragma GCC poison _itoa _itow _i64toa _i64tow _ui64toa _ui64tot _ui64tow _ultoa _ultot _ultow
#    pragma GCC poison gets _getts _gettws
#    pragma GCC poison IsBadWritePtr IsBadHugeWritePtr IsBadReadPtr IsBadHugeReadPtr IsBadCodePtr IsBadStringPtr
#    pragma GCC poison CharToOem CharToOemA CharToOemW OemToChar OemToCharA OemToCharW CharToOemBuffA CharToOemBuffW
//#    pragma GCC poison alloca _alloca
#    pragma GCC poison strlen wcslen _mbslen _mbstrlen StrLen lstrlen
#    pragma GCC poison memcpy RtlCopyMemory CopyMemory
#endif

#endif  /* _INC_BANNED */
As long as there is life, there is hope
Re[7]: [ANN] memcpy() banned
От: Аноним  
Дата: 26.05.09 07:35
Оценка: +2
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>>>Дык std::copy (с такими параметрами) тоже вроде вне закона

E>>А как тогда литералами рользоваться?

КД>Я не стал парить себе моск и...


а я вот ничего не предпринял. когда моя версия студии начнёт ругаться на memmove/memcpy, запрещу ворнинг. ну может посмотрю на memcpy_s

а std::copy для char* некошерно.
если char* — байты, то memmove использует хитрые возможности платформы, которые скорее всего не используются реализацией STL, memcpy же имеет дополнительные возможности оптимизации поверх memmove.
если char* — буквы, то strcpy_s и вообще CString заместо char*.
Re[10]: [ANN] memcpy() banned
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 26.05.09 14:09
Оценка: +1 :)
Здравствуйте, Аноним, Вы писали:

А>>>а std::copy для char* некошерно.


КД>>Можно сделать специализацию.


А>Нельзя сделать специализацию.


Вообще говоря, я думал про свою copy, бо решил забить на std::copy после перехода на VS2005

А>>>вообще CString заместо char*.


КД>>А шо это такое — CString? Ни разу за 10 лет не использовал


А>Ну как Вам объяснить. вот у std::basic_string имеются какие-то ....


Да не надо ничего объяснять. Это я так
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: А memmove?
От: Antikrot  
Дата: 21.05.09 22:22
Оценка: :)
Здравствуйте, Alexander G, Вы писали:

AG>Вот это я хочу видеть, как выстрелить себе в ногу через strlen

а мне интересно, в каком их коде определен макрос __GNUC__
Re[10]: А memmove?
От: Alexander G Украина  
Дата: 22.05.09 15:54
Оценка: +1
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Сам видел как промах в простом printf-е наглухо вешал железку.


А есть ли рантайм с этими memmove_s для железки ?
Русский военный корабль идёт ко дну!
Re[2]: [ANN] memcpy() banned
От: Mazay Россия  
Дата: 24.05.09 12:33
Оценка: -1
Здравствуйте, carpenter, Вы писали:

C>типа — пишите на шарпе уже ?


Типа юзайте STL уже.
Главное гармония ...
Re[6]: [ANN] memcpy() banned
От: superlexx  
Дата: 25.05.09 19:33
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>А как тогда литералами рользоваться?

Например так:
    typedef char T[_countof("foo")];
    const T& foo = "foo";
    std::vector<char> bar;
    bar.resize(3);
    std::copy(&foo[0], &foo[_countof(foo) - 1], bar.begin());
или через stdext::checked_array_iterator
Re[8]: [ANN] memcpy() banned
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 26.05.09 07:56
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>а std::copy для char* некошерно.


Можно сделать специализацию.

А>вообще CString заместо char*.


А шо это такое — CString? Ни разу за 10 лет не использовал
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[9]: [ANN] memcpy() banned
От: Аноним  
Дата: 26.05.09 08:13
Оценка: +1
Здравствуйте, Коваленко Дмитрий, Вы писали:

А>>а 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[8]: А memmove?
От: Alexander G Украина  
Дата: 26.05.09 12:56
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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");
А>


Так виноват-то strcat.
Русский военный корабль идёт ко дну!
Re[9]: [ANN] memcpy() banned
От: AndrewJD США  
Дата: 28.05.09 08:53
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Однако, я тем не менее, не могу понять, что мешает модульному тесту обнаружить эту проблему. Это ведь не работа с памятью в чистом C через malloc/free. Это memset, вызов которой должен заполнить кусок памяти некоторым значением. Зачем-то же мы меняем состояние этой памяти? Мы ведь ожидаем от этого какой-либо наблюдаемый эффект? Почему тест этого не проверяет?


Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[10]: Приведи пример!
От: Erop Россия  
Дата: 28.05.09 09:54
Оценка: +1
Здравствуйте, AndrewJD, Вы писали:

AJD>Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.


попробуй привести пример кода, где описанная тобой ошибка "перепутали порядок параметров memset" легко была бы гн замечена тестом? Я думаю станет понятнее и тебе и оппоненту...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: [ANN] memcpy() banned
От: rus blood Россия  
Дата: 21.05.09 17:29
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Ничего святого для них нет. Изверги




Святое — это memset.
memset — это наше все!

А memcpy не жалко...
Имею скафандр — готов путешествовать!
Re: [ANN] memcpy() banned
От: Vamp Россия  
Дата: 21.05.09 18:30
Оценка:
Маразм силен. Кроме того, не понимаю, чем strcpy_s лучше strncpy.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: [ANN] memcpy() banned
От: shrecher  
Дата: 21.05.09 18:33
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Маразм силен. Кроме того, не понимаю, чем strcpy_s лучше strncpy.


Для Microsoft лучше, т.к. создает видимость борьбы за секурити в коде, а у самих там такое ...
Re[3]: [ANN] memcpy() banned
От: Alexander G Украина  
Дата: 21.05.09 18:57
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Святое — это memset.

RB>memset — это наше все!

Давно memset не использовал. Инициализировать нулём предпочитаю через = {0} по возможности. Другие варианты использования редки. А вот memcpy и даже memmove — использую.
Русский военный корабль идёт ко дну!
Re: А memmove?
От: Erop Россия  
Дата: 21.05.09 19:28
Оценка:
Здравствуйте, Sorantis, Вы писали:


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.

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: А memmove?
От: Alexander G Украина  
Дата: 21.05.09 19:39
Оценка:
Здравствуйте, Erop,

Хороший вопрос. С одной стороны, memmove_s, как и memcpy_s уже есть (смотрю в VS2005). C другой — плохо себе представляю, как она может помочь при типичном случае перемещения "вперёд" в том же буфере.

С третьей — наверное, "маразматики" банят функции по количеству и серьёзности багов. Так тут memmove не догонит memcpy. Во-первых реже нужно копировать в тот же буфер, во-вторых, разработчик более внимателен при таком копировании.
Русский военный корабль идёт ко дну!
Re[4]: А memmove?
От: Alexander G Украина  
Дата: 21.05.09 20:03
Оценка:
Здравствуйте, Sorantis, Вы писали:

S>список баннд функций.


S># pragma deprecated (strlen, wcslen, _mbslen, _mbstrlen, StrLen, lstrlen)


Вот это я хочу видеть, как выстрелить себе в ногу через strlen
Русский военный корабль идёт ко дну!
Re[5]: А memmove?
От: Sorantis Швеция  
Дата: 21.05.09 21:10
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Sorantis, Вы писали:


S>>список баннд функций.


S>># pragma deprecated (strlen, wcslen, _mbslen, _mbstrlen, StrLen, lstrlen)


AG>Вот это я хочу видеть, как выстрелить себе в ногу через strlen


Ну это только майкрософт так решил. Стандартом не запрещено юзать strlen.
А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.
As long as there is life, there is hope
Re[2]: [ANN] memcpy() banned
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.05.09 03:18
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Маразм силен. Кроме того, не понимаю, чем strcpy_s лучше strncpy.


это просто разные вещи, strncpy — копируемая строка не влезла в целевой буфер? ну и пофиг, идем дальше; strcpy_s — копируемая строка не влезла в целевой буфер? тушим свет и сливаем воду
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[6]: А memmove?
От: byleas  
Дата: 22.05.09 05:28
Оценка:
Здравствуйте, Antikrot, Вы писали:

A>а мне интересно, в каком их коде определен макрос __GNUC__

Это они для mingw подготовили.
Re: [ANN] memcpy() banned
От: CreatorCray  
Дата: 22.05.09 08:27
Оценка:
Здравствуйте, Sorantis, Вы писали:

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 ибо она потенциально опасна.
И шоп новая версия винды при обнаружении в исполняемом файле программы этой жуткой опасной инструкции отказывалась бы его выполнять.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: А memmove?
От: Alexander G Украина  
Дата: 22.05.09 09:14
Оценка:
Здравствуйте, Sorantis, Вы писали:

S>А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.


Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.
Русский военный корабль идёт ко дну!
Re[3]: [ANN] memcpy() banned
От: Кодт Россия  
Дата: 22.05.09 11:17
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Святое — это memset.

RB>memset — это наше все!

memset — это наше ваще. Стоит перепутать "сколько байтов" и "чем заполнять", и нас ждёт сурприз!
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[4]: [ANN] memcpy() banned
От: Alexander G Украина  
Дата: 22.05.09 11:42
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Стоит перепутать "сколько байтов" и "чем заполнять", и нас ждёт сурприз!


Это грозит паскалисту/дельфисту, привыкшему к FillChar.
В CRT все подобные функции, кроме _s, имеют список параметров вида (куда, что, сколько).
Русский военный корабль идёт ко дну!
Re[7]: А memmove?
От: Sorantis Швеция  
Дата: 22.05.09 12:30
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Sorantis, Вы писали:


S>>А причина запрета МС заключается в том что strlen никогда не завершится (до тех пор пока не встретим access violation) если не найден '\0' . Потому и deprecated.


AG>Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.


strnlen , length() y std::string
As long as there is life, there is hope
Re[8]: А memmove?
От: Alexander G Украина  
Дата: 22.05.09 13:43
Оценка:
Здравствуйте, Sorantis, Вы писали:

S>strnlen ,


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.)


S>length() y std::string


Русский военный корабль идёт ко дну!
Re[7]: А memmove?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.05.09 14:26
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Не, это не то. Покажите запись за границу буфера через strlen. И секьюрную альтернативу strlen.

Чтение за границей буфера тоже может быть фатальным
Например, выход из валидного адресного пространства или порча регистров, отображенных на память.
Re[8]: А memmove?
От: Alexander G Украина  
Дата: 22.05.09 14:34
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>Например, выход из валидного адресного пространства

И что? Или ничего или упадёт с AV.

ROP>или порча регистров, отображенных на память.

В Win32 ?

ROP>Чтение за границей буфера тоже может быть фатальным

Так или иначе, _s функции, проверяют только размер буфера на запись.
Русский военный корабль идёт ко дну!
Re[9]: А memmove?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.05.09 15:25
Оценка:
Здравствуйте, 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 перепутать, только это очень маловероятно.
Re[3]: [ANN] memcpy() banned
От: Аноним  
Дата: 24.05.09 14:13
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Типа юзайте STL уже.


Можно подумать, что std::copy с char* чем-то лучше memmove.
Re[11]: А memmove?
От: superlexx  
Дата: 24.05.09 15:40
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>А есть ли рантайм с этими memmove_s для железки ?


Зависит от железки. В CRT последних версий VC имеется.
Re[11]: А memmove?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 24.05.09 23:24
Оценка:
Здравствуйте, Alexander G, Вы писали:


ROP>>Сам видел как промах в простом printf-е наглухо вешал железку.

AG>А есть ли рантайм с этими memmove_s для железки ?
Компилялось для процессоров tms320c64x / tms320c67x в среде Code Composer.
Было это давно. Был ли там memmove_s — не помню, и это не важно.
Речь шла о промашке в printf...
memcpy меня вполне устраивает.
Re[5]: [ANN] memcpy() banned
От: AndrewJD США  
Дата: 25.05.09 09:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Упавший модульный тест

Скорее всего тест отработает нормально

А>или замечание на code review это сюрприз?

Инспектора тоже могут пропустить, особенно если кода много.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: [ANN] memcpy() banned
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 25.05.09 16:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Mazay, Вы писали:


M>>Типа юзайте STL уже.


А>Можно подумать, что std::copy с char* чем-то лучше memmove.


Дык std::copy (с такими параметрами) тоже вроде вне закона
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: [ANN] memcpy() banned
От: Erop Россия  
Дата: 25.05.09 18:42
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Дык std::copy (с такими параметрами) тоже вроде вне закона

А как тогда литералами рользоваться?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: [ANN] memcpy() banned
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 25.05.09 19:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Дык std::copy (с такими параметрами) тоже вроде вне закона

E>А как тогда литералами рользоваться?

Я не стал парить себе моск и реализовал свою copy с 4-мя параметрами. Типа
template<class InputIterator,class OutputIterator>
std::pair<InputIterator,OutputIterator>
 copy(InputIterator  first,
      InputIterator  last,
      OutputIterator result_beg,
      OutputIterator result_end)
{
 for(;first!=last && result_beg!=result_end;++first,++result_beg)
  (*result_beg)=(*first);
  
 return std::make_pair(first,result_beg);
}//copy
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
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");
Re[7]: [ANN] memcpy() banned
От: AndrewJD США  
Дата: 27.05.09 06:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну, я по своей наивности полагал, что вызов 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, вызов которой должен заполнить кусок памяти некоторым значением. Зачем-то же мы меняем состояние этой памяти? Мы ведь ожидаем от этого какой-либо наблюдаемый эффект? Почему тест этого не проверяет?

[snip]
Re[10]: [ANN] memcpy() banned
От: Аноним  
Дата: 29.05.09 16:42
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Здравствуйте, Аноним, Вы писали:


[snip]

AJD>Тест проверяет наблюдаемый и ожидаемый эффект. Выход за границы буфера и порча других обьектов — это не ожидаемый эффект. Который моджет и не привести к краху, а только некорректной работе.


Я предполагал, что помимо выхода за границы буфера и порчи других объектов будет ещё и отсутсвие нужных действий, что должно сказаться на результатах тестов. Всё таки пример и правда, не помешал бы.
Re[10]: [ANN] memcpy() banned
От: Zorgiev  
Дата: 21.08.09 02:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Коваленко Дмитрий, Вы писали:


А>>>а 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 и ещё много чего интересного.

С уважением ваш Алекс.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.