Tho*_*day 29
Microsoft提供了验证其参数的memcpy和wmemcpy的替代方法.
memcpy_s说,"嗯,在我从这个地址读取之前,让我自己验证它不是空指针;在我写入这个地址之前,我将再次执行该测试.我还将比较字节数我已被要求复制到所声称的目的地大小;当且仅当电话通过所有这些测试时,我才能执行复制."
memcpy说"将目的地填入寄存器,将源填入寄存器,将计数填入寄存器,执行MOVSB或MOVSW." (关于地理位置的例子,这个世界不长:http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)
编辑:对于memcpy 的Your Wish Is My Command方法的例子,考虑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
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢,米莉史密斯!以下是我在上面链接的地理位置页面上的内容:
MOVS
指令movs用于将源字符串复制到目标(是,复制,不移动).该指令有两个变体:movsb和movsw.movsb("移动字符串字节")一次移动一个字节,而movsw一次移动两个字节.
由于我们希望一次移动几个字节,因此这些movs指令是使用rep前缀批量完成的.移动次数由CX寄存器指定.请参阅以下示例:
:
lds si, [src]
les di, [dest]
cld
mov cx, 100
rep movsb
:
Run Code Online (Sandbox Code Playgroud)
此示例将从src复制100个字节到dest.如果用movsw替换movsb,则复制200个字节.如果删除rep前缀,则CX寄存器将不起作用.您将移动一个字节(如果它是movsb,或者如果它是movsw则移动2个字节).
如果使用得当,电锯是安全的.与memcpy()相同的事情.但在这两种情况下,如果你钉了一个钉子,它会飞,并伤害你.
简而言之,memcpy()是低级计算所必需的,不会消失,但对于高级编程,您不需要它.Python中没有memcpy().
文章本身描述了一个更安全的替代方法:memcpy_s,它要求您指定目标的最大长度.如果提供的数字与要复制的字节数无关,则它可以作为防止缓冲区溢出的屏障.当然,您可以通过向两者提供相同的数字来滥用它.