常见而又隐秘的比较函数 BUG

原创 2015年07月10日 18:37:25


// Returns 0 if a == b, a negative number if a < b or a positive otherwise.

int cmp(const void *a, const void*b) {
	return *(int *)a  - *(int *)b;  
}


这是一个非常常见地使用在 qsort 等排序里的比较函数,然后这个函数本身却是存在 bug 的 —— 溢出的危险。

FAILURE TEST CASE:

</pre><p></p><pre name="code" class="cpp">int a = INT_MIN, b = 1;  // INT_MIN defined in limits.h
int result = cmp(&a, &b);  // result = INT_MAX, 这显然与 a < b 的事实不符合。

那么正确的写法是怎样的呢:

// Returns 0 if a <= b, or non-zero value otherwise.
int cmp(const void *a, const void*b) {
	return *(int *)a > *(int *)b;
}

据说《程序设计实践》一书有提到,另此书评价甚高,有空可以拜读一下。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

CSS常见BUG/清除浮动/跨浏览器兼容/函数作用域/闭包

CSS常见BUG/清除浮动/跨浏览器兼容/函数作用域/闭包

C语言中一些比较基础而又重要的知识

C语言 基础 字符串 查找 截取 前几位 初始化 二维 数组 指针 内存分配 内存拷贝 比特 移位 类型转换 CString TCHAR char LPSTR 输出到文件...
  • JuanA1
  • JuanA1
  • 2011年04月04日 16:33
  • 1271

一个简单而又不影响运行的日志函数

I/O操作比较耗时,在硬盘频繁读写时尤其耗时,比如杀毒软件扫描,磁盘碎片整理,索引服务之类的。如果在运行效率有要求的环境下有大量I/O的话就不得不考虑如何让I/O不影响运行。 I/O操作比如说日志,...

MFC常见bug

  • 2017年11月14日 11:26
  • 34KB
  • 下载

捉虫历险记——常见c++bug大围剿

  • 2007年09月19日 18:21
  • 4.06MB
  • 下载

strtok函数真是个蹩脚而又恶心的设计(千万不要嵌套使用strtok函数)

先来看一个程序: #include #include int main() { char str[] = "a = 1\nb = 2\nc = 3\nd = 4\ne = 5\nf = 6";...
  • stpeace
  • stpeace
  • 2013年11月02日 00:43
  • 4091

常见C++Bug大围剿(pdf格式)

  • 2009年12月12日 15:12
  • 4.06MB
  • 下载

捉虫历险记——常见C++Bug大围剿

  • 2007年06月05日 12:19
  • 4.45MB
  • 下载

Android中常见的Bug

CPPAlien的专栏 . [原]从Installer直接打开应用程序会出现Android系统bug 问题现象: 用Android系统自带的Installer安装完应用后,会有以下两...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常见而又隐秘的比较函数 BUG
举报原因:
原因补充:

(最多只允许输入30个字)