![]() |
1
31
微软提供 alternatives 发送到验证其参数的memcpy和wmemcpy。 memcpy_说,“嗯,在我读这个地址之前,让我自己验证一下它不是空指针;在我写信给这个地址之前,我将再次进行测试。我还将比较请求复制的字节数与目标的声明大小;如果且仅当呼叫通过所有这些测试,我才能执行副本。” memcpy说“将目的地填入寄存器,将源填入寄存器,将计数填入寄存器,执行MOVSB或MOVSW。”(关于geocities的例子,不长于这个世界: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html ) 你的愿望是我的命令 MeMcPy的方法,考虑OpenSalARIS,其中MeMCPY是(对于某些配置) defined in terms of bcopy bcopy (对于某些配置)是。。。
编辑:谢谢,米莉·史密斯!以下是我在上面链接的geocities页面上的内容: 莫夫斯 指令movs用于将源字符串复制到目标中(是,复制,不移动)。此指令有两种变体:movsb和movsw。movsb(“移动字符串字节”)一次移动一个字节,而movsw一次移动两个字节。 因为我们希望一次移动几个字节,所以这些movs指令是使用rep前缀成批执行的。移动次数由CX寄存器指定。请参见下面的示例:
此示例将从src复制100字节到dest。如果将movsb替换为movsw,则会复制200字节。如果删除rep前缀,CX寄存器将无效。您将移动一个字节(如果是movsb,则移动一个字节;如果是movsw,则移动两个字节)。 |
![]() |
2
9
不用麻烦了。微软的替代品也没那么好。主要的价值在于,这会导致您的代码无法移植到Linux。微软在他们卖给你的客户的操作系统上赚的钱比他们在你购买的Visual C++的拷贝上赚的钱多。 |
![]() |
3
8
如果使用得当,电锯是安全的。memcpy()也是如此。但在这两种情况下,如果你碰到钉子,它会飞起来伤害你。 简而言之,memcpy()对于低级计算是必需的,不会消失,但是对于高级编程您不需要它。Python中没有memcpy()。 |
![]() |
4
6
本文本身描述了一个更安全的替代方案:memcpy_,它要求您指定目标的最大长度。当提供的数字与要复制的字节数无关时,它将充当屏障,以防止缓冲区溢出。当然,你可以通过给这两个数字相同来滥用它。 |
![]() |
5
3
在代码中禁用memcpy()是让我成为更好的程序员,让我的应用程序更安全还是更不兼容?我不确定MS是否真的想更改任何东西,或者只是使任何新的C代码与其他编译器不兼容。顺便说一句,微软在很多功能上都有这种把戏,这很烦人。strcpy->strcpy_s->StringCchCopy。 |
![]() |
6
2
我认为C应该留给程序员一个选择,让他自己动手。 如果操作正确,手动内存管理是安全的。 |
![]() |
7
2
你自己也这么说:“微软在其网站上禁止使用memcpy()函数 安全编程商店 ,我理解 功能中固有的漏洞 众所周知,memcpy()和大量其他标准函数都会导致漏洞,那么,当(尽管是增量的)改进微不足道时,为什么安全编程商店会允许使用它们呢? 毫无疑问,在他们努力提高自己产品的安全性的过程中,代码审查清楚地表明,这些函数对很大一部分漏洞、缓冲区溢出等负有责任。他们将包装器引入标准库,并添加了编译器警告,而不是仅用于内部使用(不是禁令)为了所有人的利益。 |
![]() |
9
-1
如果您使用的是旧版本,如C99或C++98,或者在Solaris上,则不能使用memcpy_s,除非您安装了安全的C库。 memcpy_s()是一个特定于Microsoft的实现,根据其自身的标准,在C11之前的非MS实现(包括ANSI)上不存在。 我将把支持MS和反对MS的东西放在一边,因为这无关紧要。 memmove()是一个更好的解决方案,因为它解决了重叠问题。memmove_s()更健壮,但同样,只有在使用C11或更高版本时才更健壮。 |
![]() |
10
-2
您应该改为使用memcpy_s()。对于被认为不安全的各种其他功能,也存在相同的版本。 |
![]() |
Zax Ftw · 如何获取用于memcpy的浮点地址? 7 年前 |
![]() |
Nivs · 为什么我的代码覆盖常量int x=*(&y);工作 7 年前 |
|
Niluka · 使用memcpy将二维动态数组(指针)复制到静态数组 7 年前 |
|
andrew1601 · 使用memcpy〔closed〕获取分段错误 9 年前 |
![]() |
luke · 在malloc之后修改字符串时,“释放后修改的空闲堆块” 10 年前 |
![]() |
Angus · 了解memcpy()的实现 11 年前 |
![]() |
Ruud · 快速复制`std::vector<std::uint8_t>` 11 年前 |