宁愿犯编译期错误, 也不犯运行期错误 ---再谈 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

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、