宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = “abc“; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由

本文主要是介绍宁愿犯编译期错误, 也不犯运行期错误 ---再谈 char *p = “abc“; 的不合理性 以及 写成 if(NULL == p)而不是if(p == NULL)的理由,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        年末, 各方催进度, 大家也在抓紧时间码代码, 各种低概率死机问题频出, 这些低概率的死机问题非常难以重现和定位, 即便是修改好了, 也需要验证, 如果没有出现死机, 那也不能完全保证修改好了。 总之, 低概率问题就是这么折腾人。 

        那低概率死机问题是怎么产生的呢? 其实, 很多时候都是程序猿编码不细心, 对一些问题理解不透彻造成的。 比如最常见的内存错误问题。 

 

        在本文中, 我不去具体讨论某某问题, 而是以一个简单的例子说明安全编程的重要性, 我们来讨论编译期错误和运行期错误。我们先看一个有潜在问题的程序:

 

#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)的理由的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684661

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运