font-size: 12px !important; line-height: 1; color: rgb(0, 0, 0);">char *p = malloc ( 10 );</pre>
图 1. 垃圾数据
image
如果在对这个 p 赋值前,某个代码段尝试访问它,则可能会获得垃圾值,您的程序可能具有不可预测的⾏为。p 可能具有您的程序从未曾预料到的值。
良好的实践是始终结合使⽤ memset 和 malloc,或者使⽤ calloc。
<pre Courier New", 宋体, Courier, mono, serif; white-space: pre-wrap; overflow-wrap: break-word; overflow-x: auto; font-size: 12px !important; line-height: 1; color: rgb(0, 0, 0);">char *p = malloc (10);
memset(p,’\0’,10);</pre>
现在,即使同⼀个代码段尝试在对 p 赋值前访问它,该代码段也能正确处理 Null 值(在理想情况下应具有的值),然后将具有正确的⾏为。内存覆盖
由于 p 已被分配了 10 个字节,如果某个代码⽚段尝试向 p 写⼊⼀个 11 字节的值,则该操作将在不告诉您的情况下⾃动从其他某个位置“吃掉”⼀个字节。让我们假设指针 q 表⽰该内存。
图 2. 原始 q 内容
image
图 3. 覆盖后的 q 内容
image
结果,指针 q 将具有从未预料到的内容。即使您的模块编码得⾜够好,也可能由于某个共存模块执⾏某些内存操作⽽具有不正确的⾏为。下⾯的⽰例代码⽚段也可以说明这种场景。
box sizing
<pre Courier New", 宋体, Courier, mono, serif; white-space: pre-wrap; overflow-wrap: break-word; overflow-x: auto; font-size: 12px !important; line-height: 1; color: rgb(0, 0, 0);">char *name = (char *) malloc(11); // Assign some value to name memcpy ( p,name,11); // Problem begins here</pre>
在本例中,memcpy 操作尝试将 11 个字节写到 p,⽽后者仅被分配了 10 个字节。
作为良好的实践,每当向指针写⼊值时,都要确保对可⽤字节数和所写⼊的字节数进⾏交叉核对。⼀般情况下,memcpy 函数将是⽤于此⽬的的检查点。
内存读取越界
内存读取越界 (overread) 是指所读取的字节数多于它们应有的字节数。这个问题并不太严重,在此就不再详述了。下⾯的代码提供了⼀个⽰例。
<pre style="box-sizing: border-box; outline: 0px; margin: 0px 0px 24px; padding: 8px; font-weight: normal; position: relative; font-
image image
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论