题
最近,我偶然发现了 一篇文章 这要求Microsoft被禁止的 memcpy()
功能在其安全程的商店。我理解的漏洞所固有的功能,但是它必须禁止其使用完全?
应该程序的,我写的是避免 memcpy()
完全,或者只是保证它的安全使用的?什么替代品的存在提供类似,但更加安全的functionalilty?
解决方案
Microsoft提供 替代品 到memcpy和wmemcpy,验证它们的参数。
memcpy_s说,"嗯,我之前读的这个地址,让我验证用于自己,它不是一个空的指针;和之前我写信给这个地址,我将执行这再次测试。我还应比较数字我已要求复制到权利的大小目标;如果且只有如果呼吁通过所有这些试验应我的执行副本。"
memcpy说"的东西,目的进入一个登记册,东西源进入一个登记册,将计入一个登记册,执行MOVSB或MOVSW." (例如在地球村中,不久这个世界上: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)
编辑:例如在野外的 您的愿望就是我的命令 法memcpy,考虑的参与,其中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
编辑:谢谢,米莉*史密斯!这里是什么在地球村页我联系上:
阀门
该指令阀门是用来复制源串入的目的(是的,复制、没有移动)。这一指令有两种变体:movsb和movsw.该movsb("移动byte string")移动一个字节的时间,而movsw移动两个字节的时间。
因为我们想要移动的几个字在一段时间,这些阀门的指令完成批采用rep前缀。这些运动是通过指定CX登记册。见例如下:
:
lds si, [src]
les di, [dest]
cld
mov cx, 100
rep movsb
:
这个例子将复制100字节从来源到目的.如果你替换movsb与movsw,你复制200字,而不是。如果你删除的代表前缀,CX登记册将无效。你将一个字节(如果它是movsb,或2个字节,如果它是movsw).
其他提示
一个链锯,如果使用得当,是安全的。用的memcpy同样的事情()。但是,在这两种情况下,如果你打一个钉子,它可以飞和伤害你。
在短,的memcpy()所需的低级别的计算并不会消失,但对于高级编程,你不需要它。没有的memcpy()在Python。
不要打扰。微软的替代品时要好得多。其主要价值在于,这些导致代码变得不可移植到Linux。微软正在他们出售给您的客户比他们正在做关于++,你买的Visual C副本的操作系统上更多的钱。
在物品本身描述了一种更安全的替代:memcpy_s,这需要你指定目标的最大长度。当提供独立要复制的字节量的该号码,它作为阻挡层以防止缓存器溢出。当然,你可以被赋予了相同数量都滥用这种
时,禁止在我的代码的memcpy()使我变成一个更好的程序员和我的应用程序更安全或只是更多的不兼容?我不确定,如果MS真的想改变任何东西,或只是做任何新的C代码和其它编译器不兼容。顺便说一句。 MS确实多项功能这一招,它是很烦人的。的strcpy - > strcpy_s - > StringCchCopy
我认为C应该离开的选择程序员来拍摄自己的脚。 如果处理得当手工存储器管理是安全的。
您自己说的: “微软禁止在其安全程序商店后,我明白在功能下,固有的漏洞的memcpy()函数”
的memcpy()和其它标准功能过多已知会造成安全漏洞,那么,为什么一个安全编程商店允许其使用时(虽然增量值)的改善是微不足道的?
在努力提高自身产品的安全性毫无疑问,代码审查清楚地表明,这些功能是负责的漏洞,缓冲区溢出等的显著比例,而不是使供内部使用的包装只有他们介绍,他们进入标准库并增加了一个编译器警告(不禁止)的所有的优点。
如果您正在使用旧版本的,像C99或C ++ 98,或者在Solaris上,您不能使用memcpy_s,除非你已经安装了安全的C库。
memcpy_s()是不在非MS实现,包括ANSI,之前C11存在,每自己的标准一个Microsoft特定的实施方式。
我会离开亲-MS和抗MS的东西放在一边,因为它是不相关的。
的memmove()是一个更好的解决方案,因为无论如何它解决重叠问题。 memmove_s()更强劲,但同样,只有当你在C11或更高版本。
在替代方法是调用 memcpy_s
您应该使用memcpy_s()代替。相同种类_s版本的用于各种视为不安全其它功能存在。