当前位置:  编程技术>c/c++/嵌入式

c语言算术运算符越界问题解决方案

    来源: 互联网  发布时间:2014-10-11

    本文导语:  大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必要对这些细节有...

大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数.

作为一个系统程序员, 有必要对这些细节有深入的了解. 本篇参考csapp, 主要介绍如何判断算术运算的越界问题.

(虽然本篇的代码经过大量的测试, 但本人仍然无法保证代码的正确性, 希望大家纠错).
讲解的原则是"摆定理, 不证明, 写代码". 具体的证明过程在csapp中有详细的讲解, 也不是太难. 主要使用关键定理来写代码. Go~
问题一: 无符号数的加法越界问题
[定理]


[理解]
这个定理比较容易, 也比较能让人接受. 不解释啦.

代码如下:

/* Determine whether arguments can be added without overflow */
int uadd_ok(unsigned int x, unsigned int y)
{
return !(x+y < x);
}

问题二: 无符号数的减法越界问题
[定理]


[理解]
1. 计算机中没有减法, x-y = x+(-y), 这里的-y就是上述的y的加法逆元. 不管是有符号还是无符号, 都是转换为加法运算. 只是加法逆元的定义不同.

3. C语言保证 -x = ~x+1; 可以验证这种方式与上面公式等价.
4. s=x-y = x+(-y). 那么 不会溢出 等价于 y不为0 或者 !uadd_ok(x, -y).


代码如下:

/* Determine whether argumnts can be substracted without overflow */
int usub_ok(unsigned int x, unsigned int y)
{
return !y || !uadd_ok(x, -y);
}

问题三: 无符号数的乘法越界问题
[定理]


[理解]
等价条件可以相互推导即可.

代码如下:

/* Determine whether arguments can be multiplied without overflow */
int umul_ok(unsigned int x, unsigned int y)
{
unsigned int p = x * y;
return !x || p/x==y;
}

问题四: 有符号数的加法越界问题
[定理]
对于两个有符号数x, y. 越界的等价条件是x,y为负数, x+y为正数或者x,y为正数, x+y为负数.
[理解]
这个定理比较容易.
代码如下:

/* Determine whether arguments can be added without overflow */
int tadd_ok(int x, int y)
{
return !(x0&&y>0&&x+y

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 动态编程语言 LIME编程语言
  • c语言实现MD5算法完整代码示例
  • C语言如何改变当前语言环境
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • 如何在VIM中使汇编语言和C语言自动缩进?
  • c语言基于libpcap实现一个抓包程序过程
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • HTML超文本标记语言教程及实例
  • Redhat9安装时语言只选择了中文,现在还能再增加其它语言的支持吗?如英文
  • Redhat9安装时语言只选择了中文,现在还能再增加其它语言的支持吗?如英文 iis7站长之家
  • 请问哪里有ubuntu 9.0版本的中文语言包和KDE的中文语言包下载,我用Google搜索了很多地方都没有!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3