宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = "abc"; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由
来源:互联网 发布:工程概算软件 编辑:程序博客网 时间:2024/05/07 21:18
年末, 各方催进度, 大家也在抓紧时间码代码, 各种低概率死机问题频出, 这些低概率的死机问题非常难以重现和定位, 即便是修改好了, 也需要验证, 如果没有出现死机, 那也不能完全保证修改好了。 总之, 低概率问题就是这么折腾人。
那低概率死机问题是怎么产生的呢? 其实, 很多时候都是程序猿编码不细心, 对一些问题理解不透彻造成的。 比如最常见的内存错误问题。
在本文中, 我不去具体讨论某某问题, 而是以一个简单的例子说明安全编程的重要性, 我们来讨论编译期错误和运行期错误。我们先看一个有潜在问题的程序:
#include <iostream>using namespace std;int main(){char *p = "abc";// ...// ...char c = 100; // 随机值if(123 == c) {cout << "if" << endl;*p = '\0';}// ...return 0;}
在99%的时候(准确概率是255/256), 运行上面程序是不会有什么问题的, 但是, 如果当c的值是123, 那么上述程序运行的时候会崩溃。 究其原因,是因为后面维护该代码的程序猿看到char *p = "abc";后(尤其是看到char *p后), 判断p所指向的值是可以改变的, 于是就写了*p = '\0'; 上面程序产生了低概率的运行错误。 那作为程序猿, 我们应该怎样避免这样的问题呢? 我们更改一下上面的程序:
#include <iostream>using namespace std;int main(){const char *p = "abc";// ...// ...char c = 100; // 随机值if(123 == c) {cout << "if" << endl;*p = '\0';}// ...return 0;}再编译一下, 发现根本通过不了编译, 此时, 程序猿就意识到自己哪个地方有问题了, 于是去修改 *p = '\0'; 这样的错误。 这样, 就不会有什么低概率的运行期错误了。所以说, 加上const是安全的, 它能保证程序错在编译期间, 强迫程序猿做出修改。 反之, 如果到了运行期, 软件到了用户手上, 出现运行期错误, 那就惨了。
有时候, 一些程序猿遇到上面第二个程序的编译错误后, 居然想办法把const去掉, 让程序通过了编译, 而且运行居然也没有出错, 以为万事大吉,无语啊
再举个常见的例子, 我们一直强调: if(NULL == p)比if(p == NULL)好, 其实是在防止程序猿将 == 写成=, 我们可以看一下, 如果程序猿不小心, 将==写成了=, 那就是if(NULL = p)和if(p = NULL)了, 前者会产生编译期错误, 编译器会发现, 强迫程序猿修改; 后者极有可能产生运行期错误, 用户会发现。
总之, 运行期的错误时非常致命的。 我们要提高代码质量, 提前避免潜在的问题。
- 宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = "abc"; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由
- if(NULL != p)和if( p!=NULL )
- char *p = NULL,int *p = NULL的区别
- 函数的入口校验时,assert(NULL!=p)与if(NULL!=p)的区别
- if (p == NULL), if (p == 0) 还是 if(p) ?--再论空指针检测问题
- 关于 int *p = NULL; char *p = NULL; 的问题:
- f (p == NULL), if (p == 0) 还是 if(p) ?----再论空指针检测问题
- f (p == NULL), if (p == 0) 还是 if(p) ?----再论空指针检测问题
- public class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p== null
- char* p="abc"与char p[] = "abc"区别
- char* p = "abc" error
- 从内存的角度看free(p) , p=NULL
- 从内存的角度看free(p) , p=NULL
- 指向字符数组的指针 char*p="abc"和char p[]="abc"的区别。
- 96 c 段错误 && int *p = NULL 和 *p = NULL区别
- char *p="abc" 与 char p[]="abc" 的区别
- char *p="abc"与char p[]="abc"的不同
- char *p="abc" 与 char p[]="abc" 的区别
- Java的I/O流
- javaagent 使用以及陷阱
- 笔记:编写高质量代码 改善Java程序的151个建议
- 关于解决微信JS-SDK获取ticket报错40097问题!
- IE开发者工具 bug解决方案
- 宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = "abc"; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由
- 【学习笔记】 网络流问题
- Nginx与HAProxy在web应用中的比较
- LA 4256 序列最小修改数
- Oracle创建表分区
- poj 3692 -- Kindergarten(最大团,匈牙利)
- 蓝桥杯 基础练习 十六进制转八进制 【字符串处理】
- 带默认值参数的函数说明
- 黑马程序员——Java基础—多线程