科学网

 找回密码
  注册

tag 标签: 溢出

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]strcpy ,strncpy ,strlcpy的用法
zwtyx 2017-5-1 18:16
好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9): char * strcpy(char *to, const char *from) { char *save = to; for (; (*to = *from) != '/0'; ++from, ++to); return(save); } 但通常,我们的 from 都来源于用户的输入,很可能是非常大的一个字符串,因此 strcpy 不够安全。 2. strncpy 在 ANSI C 中,strcpy 的安全版本是 strncpy char *strncpy(char *s1, const char *s2, size_t n); 但 strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定 n 并不是 sizeof(s1),而是要复制的 char 的个数。一个最常见的问题,就是 strncpy 并不帮你保证 /0 结束。 char buf ; strncpy( buf, abcdefgh, 8 ); 看这个程序,buf 将会被 abcdefgh 填满,但却没有 /0 结束符了。 另外,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 /0 填充。这又出现了一个效率上的问题,如下: char buf ; strncpy( buf, abcdefgh, 79 ); 上面的 strncpy 会填写 79 个 char,而不仅仅是 abcdefgh 本身。 strncpy 的标准用法为:(手工写上 /0) strncpy(path, src, sizeof(path) - 1); path = '/0'; len = strlen(path); 3. strlcpy // Copy src to string dst of size siz. At most siz-1 characters // will be copied. Always NUL terminates (unless siz == 0). // Returns strlen(src); if retval = siz, truncation occurred. size_t strlcpy(char *dst, const char *src, size_t siz); 而使用 strlcpy,就不需要我们去手动负责 /0 了,仅需要把 sizeof(dst) 告之 strlcpy 即可: strlcpy(path, src, sizeof(path)); len = strlen(path); if ( len = sizeof(path) ) printf(src is truncated.); 并且 strlcpy 传回的是 strlen(str),因此我们也很方便的可以判断数据是否被截断。 strlcpy 并不属于 ANSI C,至今也还不是标准。 strlcpy 来源于 OpenBSD 2.4,之后很多 unix-like 系统的 libc 中都加入了 strlcpy 函数,我个人在 FreeBSD、Linux 里面都找到了 strlcpy。(Linux使用的是 glibc, glibc里面有 strlcpy,则所有的 Linux 版本也都应该有 strlcpy) 但 Windows 下是没有 strlcpy 的,对应的是strncpy和memset函数
个人分类: C语言|5 次阅读|0 个评论
红色溢出,数码照片无法回避的问题
lixuekuan 2010-12-10 16:24
所有的数码相机对红色都不怎么敏感,总有红色溢出现象出来,让鲜花变成红色一片缺失红花的细节,这是数码相机的一个软肋。家用相机尤其明显,同时数码相机对黄色和紫色也有一定的溢出现象产生。对这类照片高手可以PS校正,但修一张照片需要很长时间。那位有简单点的方法? 发几张很久以前拍的红色的花,感到颜色怪怪的,而且没有细节。
个人分类: 美图欣赏|9501 次阅读|12 个评论
硬件实现两个无符号数相加时,结果是否溢出的判断方法
eecs 2010-4-21 12:30
这里讲用硬件如何实现两个无符号数相加时,结果是否溢出的判断方法。 假设两个加数为A和B,和为C,即A+B=C,其中A、B、C都是n位的,假设溢出位为o。 方法1:o=(A B )|(((A (~B ))|((~A )B ))(~C )) 使用的时候,通过组合电路生成C和o,然后将C和o寄存。 这种方法适用于硬件中 没有全加器 , 只有半加器 的情况。 方法1指出溢出的条件为:当A、B的最高位为1时,和溢出;当A和B的最高位有一个为1时,当C的最高位为0时溢出。 证明:假设A的最高位为1,B的最高位为0,则A的取值范围 ,B的取值范围 。那么A+B的取值范围为 ,当A+B的值位于 时,没有溢出,C的最高位肯定为1;当A+B的值位于 时,溢出,C的最高位肯定为0(因为数值范围 的次高位,也就是C的最高位都为0)。 方法2:当硬件中 有全加器 时,将C扩展为n+1位,则o=C 。 方法3:当CB或者CA时,肯定就溢出了。
个人分类: 文章专区|7489 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-15 01:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部