Memcpy () в безопасном программировании?

Вы можете найти его ограничения в разделе OVS limit doc :

Предел потоков ядра:

Потоки ядра ограничены только памятью, доступной ядру , Производительность снизится за пределы 1 048 576 потоков ядра на мост с 32-разрядным ядром, за пределы 262 144 с 64-разрядным ядром

blockquote>

Предел потоков OpenFlow:

Потоки OpenFlow ограничено только доступной памятью. Производительность линейна по числу уникальных шаблонов подстановочных знаков.

BLOCKQUOTE>

15
задан Tim 15 May 2009 в 17:47
поделиться

9 ответов

Microsoft предоставляет альтернативы memcpy и wmemcpy, которые проверяют их параметры.

memcpy_s говорит: «Хм, прежде чем я начну читать с этого адреса, позвольте мне лично убедиться, что это не нулевой указатель; и прежде, чем я напишу по этому адресу, я проведу этот тест еще раз. Я также сравню количество байтов, которые меня попросили скопировать, с заявленным размером места назначения; если и только если вызов проходит все эти тесты, я должен выполнить копию ».

memcpy говорит:« Заполнить адресат в регистр, заполнить источник в регистр, заполнить счетчик в регистре, выполнить MOVSB ​​или MOVSW ». (Пример для геогородов, недолго для этого мира: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html )

Изменить: В качестве примера подхода Your Wish Is My Command к memcpy, рассмотрим OpenSolaris, где memcpy (для некоторых конфигураций) определяется в терминах bcopy и bcopy (для некоторых конфигураций) ...

void
     33 bcopy(from, to, count)
     34 #ifdef vax
     35     unsigned char *from, *to;
     36     int count;
     37 {
     38 
     39     asm("   movc3   12(ap),*4(ap),*8(ap)");
     40 }
     41 #else
     42 #ifdef u3b      /* movblkb only works with register args */
     43     unsigned char *from, *to;
     44     int count;
     45 {
     46     asm("   movblkb %r6, %r8, %r7");
     47 }
     48 #else
     49     unsigned char *from, *to;
     50     int count;
     51 {
     52     while ((count--) > 0)
     53         *to++ = *from++;
     54 }
     55 #endif

Редактировать: Спасибо, Милли Смит! Вот что было на странице geocities, на которую я ссылался выше:

MOVS

Инструкция movs используется для копирования исходной строки в место назначения (да, копировать, не перемещать). У этой инструкции есть два варианта: movsb и movsw. Команда movsb («перемещение байта строки») перемещает по одному байту за раз, тогда как movsw перемещает два байта за раз.

Поскольку мы хотим перемещать несколько байтов за раз, эти инструкции movs выполняются пакетами с использованием rep префикс. Количество перемещений определяется регистром CX. См. Пример ниже:

:
lds   si, [src]
les   di, [dest]
cld
mov   cx, 100
rep   movsb
:

В этом примере будет скопировано 100 байт из src в dest. Если вы замените movsb на movsw, вместо этого вы скопируете 200 байт. Если вы удалите префикс rep, регистр CX не будет иметь никакого эффекта. Вы переместите один байт (если это movsb, или 2 байта, если это movsw).

29
ответ дан 1 December 2019 в 00:11
поделиться

Бензопила при правильном использовании безопасна. То же самое и с memcpy (). Но в обоих случаях, если вы ударите гвоздь, он может полететь и поранить вас.

Короче говоря, memcpy () требуется для низкоуровневых вычислений и никуда не денется, но для программирования высокого уровня вы этого не сделаете. Мне это не нужно.

8
ответ дан 1 December 2019 в 00:11
поделиться

В самой статье описана более безопасная альтернатива: memcpy_s, которая требует от вас укажите максимальную длину мишени. Когда это число предоставляется независимо от количества байтов для копирования, оно действует как барьер для предотвращения переполнения буфера. Конечно, вы можете злоупотребить этим, присвоив обоим один и тот же номер.

6
ответ дан 1 December 2019 в 00:11
поделиться

Я думаю, что C должен оставить программисту возможность стрелять собственной ногой. ручное управление памятью безопасно, если все сделано правильно.

2
ответ дан 1 December 2019 в 00:11
поделиться

Вместо этого вы должны использовать memcpy_s (). Такие же версии _s существуют для множества других функций, считающихся незащищенными.

-2
ответ дан 1 December 2019 в 00:11
поделиться

Альтернативой является вызов memcpy_s

-2
ответ дан 1 December 2019 в 00:11
поделиться

Делает ли запрет memcpy () в моем коде лучшим программистом, а мое приложение - более безопасным или просто несовместимым? Я не уверен, действительно ли MS хочет что-то изменить или просто сделать новый код C несовместимым с другими компиляторами. Кстати. MS делает этот трюк для многих функций, и это довольно раздражает. strcpy -> strcpy_s -> StringCchCopy.

3
ответ дан 1 December 2019 в 00:11
поделиться

Не беспокойтесь. Альтернативы Microsoft не намного лучше. Основная ценность заключается в том, что из-за этого ваш код становится недоступным для Linux. Microsoft зарабатывает гораздо больше денег на ОС, которую они продают вашим клиентам, чем на копии Visual C ++, которую вы купили.

9
ответ дан 1 December 2019 в 00:11
поделиться

Вы сами сказали: «Microsoft запрещает функцию memcpy () в своих магазинах безопасного программирования , я понимаю уязвимости, присущие функции , "

memcpy () и множество других стандартных функций, как известно, вызывают уязвимости, так почему же в магазине безопасного программирования разрешено их использование, если улучшение (хотя и постепенное) тривиально?

Вне всяких сомнений, в их усилиях по повышению безопасности своих продуктов, обзоры кода ясно показали, что эти функции были ответственны за значительную часть уязвимостей, переполнения буфера и т. Д. Вместо того, чтобы делать оболочки только для внутреннего использования, они ввели их в стандартная библиотека и добавлено предупреждение компилятора (не запрет) для всеобщего блага.

2
ответ дан 1 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: