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[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[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
От: 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[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]: [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[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 же не обладает вышеозначенными недостатками, и вполне установленный факт, что он использует подсчёт ссылок. Стандарная строка — стандартная, и поэтому велосипеды широко используются.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.