软件编程低级错误:空指针
处理空指针异常的七种方法

处理空指针异常的七种方法处理空指针异常(NullPointerException)的方法有很多种,主要取决于异常产生的原因和上下文。
以下是一些常见的处理方式:1.检查并处理可能的空值:这是处理空指针异常的最基本方式。
在访问对象的属性或方法之前,先检查对象是否为null。
如果是null,就进行适当的处理,例如返回一个默认值或者抛出一个更有意义的异常。
例如:String str = getSomeString();int length = (str != null) ? str.length() : 0;2.使用Optional类:Java 8引入了Optional类,可以更好地处理可能为null的情况。
使用Optional可以避免空指针异常,并且使代码更易于理解和维护。
例如:Optional<String> optionalStr = Optional.ofNullable(getSomeString());int length = optionalStr.map(String::length).orElse(0);3.使用异常处理:如果某些情况下空指针异常不可避免,可以使用try-catch语句来捕获并处理它。
在catch块中,可以记录日志、抛出自定义异常或者进行其他处理。
例如:try {// 可能会抛出NullPointerException的代码块} catch (NullPointerException e) {// 处理空指针异常的代码块,例如记录日志、抛出自定义异常等}4.重构代码:如果空指针异常是由于代码结构或者设计问题引起的,那么可能需要重构代码来避免这种异常。
例如,通过使用设计模式、创建更清晰的API或者封装可能为null的对象等方法。
5.利用IDE的帮助:许多集成开发环境(IDE)如IntelliJ IDEA或Eclipse都有强大的代码分析工具,可以帮助识别并预防空指针异常。
空指针异常

空指针异常空指针异常(Null Pointer Exception)是一种在计算机程序中经常出现的错误。
它表示当程序试图访问一个空对象时发生的异常。
在这篇文章中,我将探讨空指针异常的原因、常见的场景和如何避免它。
空指针异常通常是由于在程序中使用了一个空引用导致的。
简单来说,当程序试图使用一个未初始化的对象或者一个空对象时,就会抛出空指针异常。
空指针异常可能出现在很多不同的情况下,下面是几个常见的示例:1. 对象未初始化:如果没有正确地初始化一个对象,那么在对其进行操作时就会发生空指针异常。
例如,在创建一个数组后,如果没有为数组的元素分配内存空间,那么当尝试访问数组元素时就会抛出异常。
2. 对象被删除:如果一个对象在使用之后被删除,但后续仍然试图对其进行操作,那么就可能会抛出空指针异常。
这通常发生在没有正确管理内存的情况下,即没有正确释放已删除对象的内存空间。
3. 方法返回空值:如果一个方法返回一个空值,而在调用该方法后没有对返回值进行检查,那么就有可能导致空指针异常。
在使用方法返回值之前,应该始终检查其是否为空。
空指针异常对程序的运行有严重影响。
当发生空指针异常时,程序会立即停止执行,并且可能导致整个系统崩溃。
因此,避免空指针异常非常重要。
为了避免空指针异常,我们可以采取一些预防措施:1. 初始化对象:在使用对象之前,始终确保对其进行正确的初始化。
这样可以确保对象被正确构造,并且不为空。
2. 检查对象是否为空:在使用对象之前,应该始终检查对象是否为空。
可以使用条件语句来检查对象是否为null,如果对象为空,则不应继续执行其他操作。
3. 合理处理返回值:在调用方法后,应该对返回值进行检查,以确保返回的值不为空。
如果返回的值为空,则应该采取相应的措施,而不是继续使用空值进行操作。
空指针异常是一个常见的程序错误,但它可以通过良好的编程习惯和预防措施来避免。
在编写代码时,我们应该始终注意初始化对象,检查对象是否为空,并且合理处理返回值。
空指针异常是什么原因

空指针异常是什么原因在编程的世界里,空指针异常是一个让开发者颇为头疼的问题。
那么,到底什么是空指针异常?它又是因何产生的呢?首先,我们来理解一下什么是指针。
简单来说,指针就像是一个地址标签,它指向了计算机内存中的某个位置,在这个位置上存放着我们需要的数据。
而空指针呢,就是一个没有指向有效内存位置的指针。
那么,空指针异常又是怎么回事呢?当我们的程序试图通过一个空指针去访问或者操作其所指向的数据时,就会引发空指针异常。
这就好比你拿着一个地址标签,上面写的是一个不存在的地址,然后你还想从这个不存在的地址里取出东西,那肯定是不行的,系统就会报错。
空指针异常产生的原因多种多样。
其中一个常见的原因是在程序中没有正确地初始化指针。
比如说,我们声明了一个指针变量,但是忘记给它赋值,让它指向一个有效的内存位置,这时候它就是一个空指针。
如果后续的代码直接使用这个未初始化的指针,就会触发空指针异常。
另外,当我们在程序中动态分配内存后,如果没有正确地处理内存释放的情况,也可能导致空指针异常。
比如,我们使用`malloc`或者`new`等操作分配了一块内存,但是在使用完后没有使用`free`或者`delete`来释放它。
当再次使用这个已经释放的指针时,就可能出现空指针异常。
函数的返回值也可能导致空指针异常。
如果一个函数返回了一个指针,但是在调用这个函数时没有对返回值进行有效的判断和处理,当返回的是一个空指针时,后续直接使用这个指针就会引发异常。
还有一种情况是在多线程编程中,如果多个线程同时操作一个指针,并且没有进行正确的同步和互斥处理,可能会导致某个线程在使用指针时,它已经被其他线程修改为空指针了。
再来说说在对象的使用中,如果我们对一个对象进行了错误的操作,导致对象被销毁或者其内部的指针被设置为空,而后续的代码又使用了这个对象的指针,也会产生空指针异常。
为了避免空指针异常,我们在编程时需要养成良好的习惯。
首先,一定要确保指针在使用前被正确地初始化。
编程中常见的错误及如何解决

编程中常见的错误及如何解决编程是一门需要细致、耐心和专注的技能,即使经验丰富的程序员也难免会遇到错误。
在本文中,我将介绍一些常见的编程错误,并给出解决这些问题的方法。
这些错误不仅适用于初学者,同样也适用于有经验的程序员。
一、语法错误语法错误是编程中最常见的错误之一。
它们通常是由于遗漏了分号、括号或其他语法元素而导致的。
解决这些错误的方法是使用合适的开发工具,如集成开发环境(IDE),它们会在编辑代码时自动检查语法错误并给出提示。
此外,定期检查代码的缩进和括号匹配也是避免语法错误的好方法。
二、逻辑错误逻辑错误是编写出的代码逻辑不正确或不合理而导致的错误。
这些错误通常很难被发现,因为它们不会导致编译错误。
解决这些错误的方法是通过调试器逐步运行程序并检查代码的执行路径。
通过观察变量的值和程序的输出,可以找到并修复逻辑错误。
三、空指针异常空指针异常是在使用空对象时引发的错误。
它们通常是由于没有对对象进行初始化或在使用对象之前忘记检查对象为空而导致的。
解决这些错误的方法是使用空指针检查语句,如if语句或三元运算符。
在使用对象之前,始终检查对象是否为空,以避免空指针异常。
四、内存泄漏内存泄漏是指程序中的一块内存分配未能及时释放,导致内存资源的浪费和程序性能的降低。
解决这些错误的方法是在程序中显式地释放不再使用的内存,如关闭文件、释放动态分配的内存等。
另外,使用内存管理工具,如Valgrind,可以帮助检测和解决内存泄漏问题。
五、数组越界数组越界是指在访问数组元素时使用了超出数组边界的索引。
这种错误通常会导致程序崩溃或产生意外的结果。
解决这些错误的方法是在访问数组元素之前,始终检查索引是否在合法范围内。
对于循环遍历数组的情况,确保索引不会超出数组长度。
六、死循环死循环是指程序中的循环结构无法正常终止的情况。
这种错误通常是由于循环条件不正确或循环体内缺少终止条件而导致的。
解决这些错误的方法是仔细检查循环条件和终止条件,确保程序可以顺利退出循环。
软件编程低级错误:空指针

HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
定时器处理函数没有判断指针非空
【问题描述】测试人员在测试过程中发现scf出现core:查看日志分析scf在收到CCA(Term)消息时调 问题描述】 用函数clearDiamCCATimer清除等待CCA(Term)后,又进入处理定时器事件处理函数 processDiamCCATimeOut,在该函数中出现core。 【问题定位】在如下场景中将会出现空指针引用导致core: 问题定位】
头部增加m_pResendDiamCCR是否为空的判断 【纠正措施】在函数processDiamCCATimeOut头部增加 纠正措施】在函数 头部增加 是否为空的判断
if (NULL == m_pResendDiamCCR) { return ; } *pTmpDiamCCR = *(TDiamScpCCR *)(m_pResendDiamCCR->pMsgPara);
2012-3-5
Security Level:
公司常见软件编程低 级错误: 级错误:空指针
PSST系统工程部 PSST系统工程部 C语言软件编程规范工作组
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
前言
这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。 这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。 C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导 和 语言是我司的主流编程语言,然而 具有很多强大的语言特性, 语言是我司的主流编程语言 具有很多强大的语言特性 非常复杂, 致C/C++非常复杂,使得代码更容易出现 非常复杂 使得代码更容易出现BUG、难以阅读和维护。 、难以阅读和维护。 业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA 容易出现问题的语言特性进行管理。例如 业界知名的编程规范都对 容易出现问题的语言特性进行管理 版的MISRAC规范指出,一些在 看来可 规范指出, (汽车工业软件可靠性联合会)制定的1998版的 汽车工业软件可靠性联合会)制定的 版的 规范指出 一些在C看来可 以接受,却存在隐患的地方有127处之多。2004版的 处之多。 版的MISRAC规范将针对 语言的规 规范将针对C语言的规 以接受,却存在隐患的地方有 处之多 版的 规范将针对 则增加到了141条。 条 则增加到了 对于程序员来说,能工作的代码并不等于“ 代码。 代码的指标很多, 对于程序员来说,能工作的代码并不等于“好” 代码。“好”代码的指标很多,包 括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良 括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码, 编程习惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。 编程习惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。
计算机软件常见错误解决办法

计算机软件常见错误解决办法第一章:编译错误解决办法编译错误是在软件开发过程中常见的问题之一。
解决编译错误需要仔细检查代码,并根据错误信息进行相应的处理。
以下是一些常见的编译错误及解决办法。
1. “未定义的标识符”错误:这种错误通常是由于变量、函数或类的定义缺失导致的。
解决方法是在代码中正确地定义相应的标识符。
2. “语法错误”:语法错误通常指代码中的拼写错误、符号错误或者错误的语法结构。
解决方法是仔细检查代码,并根据编译器给出的错误信息进行修改。
3. “未引用的变量”错误:这种错误表示代码中存在变量声明,但未对其进行引用。
解决方法是检查变量声明和引用的代码,并进行相应的修改。
第二章:运行时错误解决办法运行时错误是在程序执行过程中出现的错误,通常是由逻辑错误、内存错误或者输入错误引起的。
以下是一些常见的运行时错误及解决办法。
1. “空指针异常”:这种错误表示程序试图访问空指针。
解决方法是在使用指针前,判断其是否为空,并进行相应的处理。
2. “数组越界”:数组越界错误表示程序试图访问数组中超出有效范围的元素。
解决方法是检查数组的索引,并确保其不超过数组的长度。
3. “逻辑错误”:逻辑错误通常是由于程序设计不正确导致的。
解决方法是仔细检查程序逻辑,并进行必要的修改。
第三章:内存错误解决办法内存错误是指程序在使用内存时出现的错误,包括内存泄漏和内存溢出等。
以下是一些常见的内存错误及解决办法。
1. “内存泄漏”:内存泄漏是指程序在分配内存后,未能正确释放导致内存的浪费。
解决方法是确保在使用完内存后进行及时释放。
2. “内存溢出”:内存溢出错误表示程序试图分配超过内存容量的空间。
解决方法是优化程序,减少对内存的需求,或者使用动态内存分配来解决问题。
3. “野指针”:野指针是指指向已释放内存的指针。
解决方法是在释放内存后,将指针设置为NULL,避免再次使用。
第四章:网络错误解决办法网络错误是指程序在进行网络通信时出现的问题,包括连接错误、超时错误和数据传输错误等。
解决常见的编码错误和bug
解决常见的编码错误和bug在编写和调试代码的过程中,经常会遇到一些常见的编码错误和bug。
这些问题可能会导致程序崩溃、产生错误结果或功能不正常。
为了能够更高效地解决这些问题,以下是一些常见的编码错误和bug以及解决方法。
1.语法错误:这是最常见的错误之一,通常是由于拼写错误、缺少括号、分号或其他基本的语法错误导致的。
解决方法是仔细检查代码,确保拼写正确并添加所需的标点符号。
2.空指针异常:这是由于引用了空对象导致的错误。
解决方法是在使用对象之前,先检查对象是否为null,并在需要时进行适当的处理,例如使用条件语句判断是否为空。
3.数组越界:这是由于访问数组中不存在的索引位置导致的错误。
解决方法是在访问数组时,确保索引值的范围在合法的范围内,可以使用条件语句或循环来检查索引的有效性。
4.逻辑错误:这是由于程序设计上的逻辑错误导致的错误结果或功能不正常。
解决方法是仔细审查代码逻辑,确保算法和条件语句的设计正确,并适时调试代码以查找错误。
5.死循环:这是由于循环条件恒为真或条件永远不满足导致的错误。
解决方法是检查循环条件,确保循环可以正常终止,并通过添加适当的终止条件来修复死循环问题。
6.文件读写错误:这是由于文件路径错误、权限问题或文件格式错误导致的错误。
解决方法是检查文件路径是否正确、确认文件是否存在,并确保程序具有读写文件的权限。
另外,还可以使用异常处理机制来捕获和处理可能出现的文件读写错误。
7.并发问题:这是由于多个线程访问共享资源导致的错误。
解决方法是使用锁或同步机制,以确保同一时间只有一个线程能够访问共享资源,从而避免竞争条件和数据不一致的问题。
8.内存泄漏:这是由于程序中未正确释放不再使用的内存导致的问题。
解决方法是在使用完毕后,确保及时释放不再需要的对象或资源,避免内存泄漏问题的发生。
9.数据类型错误:这是由于不同类型的数据之间进行了不兼容的操作而导致的错误。
解决方法是检查数据类型是否匹配,并在必要时进行类型转换,以确保操作的正确性和合法性。
java 避免空指针的 5 个案例。
在Java编程中,空指针异常是一种常见的bug,可能会导致程序的崩溃和不可预测的后果。
为了避免这种情况,我们可以采用一些技巧和方法来规避空指针异常的发生。
在本文中,我将共享5个避免空指针异常的案例,帮助大家更好地理解和避免这一常见问题。
1. 使用Optional类在Java 8及以后的版本中,引入了Optional类,它可以帮助我们明确地表示一个值可能是缺失的情况。
通过使用Optional类,我们可以避免直接使用可能为空的引用,从而避免空指针异常的发生。
我们可以使用Optional.ofNullable方法来创建一个可能为空的对象,然后通过isPresent方法来判断是否存在数值,以及通过orElse方法来提供一个默认值。
2. 使用断言在编程的过程中,我们经常会有一些假设,例如某个对象不会为空。
通过使用断言来验证这些假设,可以帮助我们及早地发现潜在的空指针异常。
在Java程序中,我们可以使用断言关键字assert来检查一个条件是否为真,如果条件为假,程序将抛出AssertionError异常。
通过在程序中添加适当的断言,我们可以有效地避免空指针异常的发生。
3. 避免链式调用在Java编程中,我们经常会使用链式调用来操作对象,例如a.getB().getC().doSomething()。
然而,如果a、b或c中的任何一个为null,就会导致空指针异常。
为了避免这种情况,我们可以将链式调用拆分成多个步骤,逐步进行空指针检查,确保每一步操作的对象都不为null,从而避免空指针异常的出现。
4. 使用Objects.requireNonNull在编写Java代码时,可以使用Objects.requireNonNull方法来检查方法的参数是否为null。
如果参数为null,将抛出NullPointerException异常,从而避免在后续的代码中出现空指针异常。
通过在方法的开头添加适当的参数检查,可以有效地规避空指针异常的发生。
空指针解引用 例子
空指针解引用例子空指针解引用是程序中一种常见的错误类型。
当一个指针指向了空的内存位置,然后再尝试对该指针进行解引用操作时,就会发生空指针解引用错误。
这种错误通常会导致程序崩溃或产生不可预测的行为。
空指针解引用错误常见于以下情况:1. 未初始化指针:如果一个指针变量没有被初始化,那么它的值就是一个随机的内存地址,很有可能是空指针。
如果在未对该指针进行初始化的情况下就尝试解引用它,就会发生空指针解引用错误。
例如,下面的代码中,指针p没有被初始化,然后就对它进行了解引用操作:```c++int* p;int value = *p;```在这种情况下,value的值是不确定的,很可能导致程序崩溃。
2. 指针指向已释放的内存:在动态内存管理中,如果一个指针指向了已释放的内存位置,再尝试对该指针进行解引用操作就会发生空指针解引用错误。
例如,下面的代码中,指针p首先指向了动态分配的内存,然后在释放该内存后对p进行了解引用操作:```c++int* p = new int;delete p;int value = *p;```在这种情况下,解引用操作将会访问到已经释放的内存,很可能导致程序崩溃。
为了避免空指针解引用错误,我们可以采取以下措施:1. 初始化指针变量:在声明一个指针变量时,为其赋初值,或者直接将其初始化为空指针:```c++int* p = nullptr;```这样即使在后续的使用中忘记对指针进行初始化,编译器也会将其自动初始化为空指针,避免了未初始化指针的问题。
2. 检查指针是否为空:在对指针进行解引用操作之前,先判断指针是否为空,避免空指针解引用错误。
```c++if (p != nullptr) {int value = *p;// 对指针进行解引用操作} else {// 指针为空的处理逻辑}```通过添加这样的判断语句,可以保证只在指针非空的情况下进行解引用操作,避免空指针解引用错误。
总之,空指针解引用错误是程序中常见的错误类型,但通过合理的编程习惯和检查机制,我们可以有效地避免或减少这类错误的发生。
空指针异常
空指针异常空指针异常是一种在编程中常见的错误类型,它会在程序运行过程中抛出,并且经常导致程序崩溃。
出现空指针异常时,通常是因为程序试图访问一个没有指向有效对象的空指针(null)。
空指针异常一般由以下几种情况引发:1. 变量未初始化:当一个变量声明后没有被赋予初始值,就会被默认赋予空指针值。
如果该变量在后续的代码中被使用,则会引发空指针异常。
2. 对象引用为空:当一个对象引用被赋值为null,而后又试图调用该对象的方法或访问其属性时,就会抛出空指针异常。
3. 方法返回值为空:当一个方法声明了返回值类型,但在代码中没有正确地返回有效对象时,调用该方法可能会导致空指针异常。
空指针异常可能导致程序崩溃,因此在编码过程中需要注意避免产生这种异常。
以下是几种常用的预防措施:1. 初始化变量:在声明变量的同时,确保为它赋予一个初始值,避免出现未初始化的情况。
2. 检查对象引用:在使用对象引用之前,先进行非空判断。
可以使用if语句或者三元表达式,判断对象引用是否为null,若为null则进行相应的处理。
3. 方法返回值检查:在调用方法的返回值之后,进行非空判断。
如果返回值为null,可以根据实际情况进行处理,例如抛出异常或返回默认值。
除了以上的预防措施,调试工具也可以被用来检测和修复空指针异常。
使用调试工具可以追踪程序的执行过程,并且能够在空指针异常发生时提供相关的调用栈信息,有助于定位和修复问题。
总结起来,空指针异常是一种常见的编程错误,可以通过初始化变量、检查对象引用和方法返回值的方式来预防。
同时,调试工具也可以帮助我们追踪和修复空指针异常。
在编程过程中,合理使用这些方法和工具,可以有效地避免空指针异常的发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4)处理定时器超时事件,调用processDiamCCATimeOut:从m_pResendDiamCCR中获取重发消息。
TInterpretR TSCSM::processDiamCCATimeOut() { 。。。 *pTmpDiamCCR = *(TDiamScpCCR *)(m_pResendDiamCCR->pMsgPara); //当出现上面的场景时,此时m_pResendDiamCCR为空,core 。。。 }
【问题定位】在删除Rule-map时,如果它引用了Link-group,则将Link-group中的 pLink的引用计数减一。开发人员认为全局变量pLink永远不可能为NULL,所以没 有判断其合法性。
正常情况下,pLink确实不可能为NULL,但当系统重启时,先恢复了Rule-map,
在恢复Link-group之前,pLink指针为NULL。此时如果从命令行删除所有的Rulemap,就会出现DA异常。 【纠正措施】访问pLink之前,判断其是否为NULL
void CSCP::AnalysisConnectRequest(CTI_RESOURCE_CONNECT_Msg* pMsg, CConnectNode* pNode,CConference* pOcuppyConf) { CConnectObject* pObject ... ... if(pSourceObject != NULL && pDestObject != NULL) { if(!pSourceObject->IsConference() && !pDestObject->IsConference()) { CConference* pDevice = pOcuppyConf; if (!pDevice) { //lint -e{413} if(CONN_CONF_REQUEST==pObject->m_ucCurConnectContext) //使用指针时没有检查,导致使用空 = NULL;
【纠正措施】对指针应做合法性检查
if (pLogItem == NULL)
return retValue; hr = pLogItem->get_nextSibling(&pMediaNextNode);
【举一反三】外部文件读入的指针,可能为空,使用之前必须判断是否合法
HUAWEI TECHNOLOGIES CO., LTD.
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
空指针操作:多个条件一起判断(1)
【问题描述】测试接口时,如果没有输入必选参数(操作类型operationType),系统 异常 【问题定位】
if (operationType != null && operationType.equals("1")){ // 分支操作 } else if (operationType.equals("2")){ // 分支操作 } else { // 分支操作 }
没有判断外部传入指针非空
【问题描述】终端向服务器注册,服务器返回403失败响应,这时终端向服务器发
送群组广告,服务core。
【问题定位】从core文件中看,是空指针引起。根据core文件中提供的的信息,反 向检视代码, 发现蓝色部分存在问题,对获取到的变量未做空指针判断:
pSession->SetUserContext( pLogic->GetPoCPCUUserContext() );
中没有捕获这个异常 【根本原因】C++语言中New内存失败后可以出现两种情况,一种是
返回NULL,一种是抛出异常。可以在调用New函数时使用参数指定,
也可以在编译选项中统一选择一种处理方式。项目组没有明确规定采 用哪种处理方式,开发人员根据以前项目组的经验调用New函数后,
判断是否非空,但在这个项目中即使New失败也不会返回NULL。
表面上代码对空指针和各种取值都进行了判断,但是当operationType为null时,第一 行的判断为FALSE,然后执行第二个判断分支,立刻出现空指针异常。 其实,我们代码中经常会出现这样的低级错误,编码者第一次判断时思路很清晰,要 对对象判空,但是以后想当然认为第一次已经判空了,else if之后就不需要再次判断。 【纠正措施】见下页
【纠正措施】在函数processDiamCCATimeOut头部增加m_pResendDiamCCR是否为空的判断
if (NULL == m_pResendDiamCCR) { return ; } *pTmpDiamCCR = *(TDiamScpCCR *)(m_pResendDiamCCR->pMsgPara);
return ;
【举一反三】外部文件读入的指针,可能为空,使用之前必须判断是否合法
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
定时器处理函数没有判断指针非空
【问题描述】测试人员在测试过程中发现scf出现core:查看日志分析scf在收到CCA(Term)消息时调
FILE *fp=fopen( "./writeAlarmLastTime.log","r");
char buff[128]=""; fscanf(fp,“%s”,buff); //读取最新的告警时间;由于文件writeAlarmLastTime.log为空,导致buff为空 fclose(fp);
【举一反三】注意定时器里面的指针,是否在其他任务里面被删除
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
指针初始化NULL,使用前没有检查
【问题描述】山西电信客服坐席全部签出 【问题定位】 CTIServer发起资源连接时,如果发现两个连接方都 已经存在有非会场的资源连接,则处理时存在有空指针访问。
用函数clearDiamCCATimer清除等待CCA(Term)后,又进入处理定时器事件处理函数
processDiamCCATimeOut,在该函数中出现core。 【问题定位】在如下场景中将会出现空指针引用导致core:
1)收到CCA(Term)消息,消息入队列 2)定时器触发,定时器超时事件入队列 3)处理CCR(Term)消息,调用clearDiamCCATimer:清除定时器后,删除保存重发CCR消息的指针m_pResendDiamCCR
编程习惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。
本胶片收集了常见的空指针案例,给出了相应的纠正措施。
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
申请内存没有捕获异常
【问题描述】Web服务器返回500错误。
【问题定位】New内存失败,不会返回NULL,而会抛出异常,但代码
在用户未注册上时,服务器清空了资源,使得pLogic->GetPoCPCUUserContext()取出
来时为空,但传入方与接收方都未做空指针判断,导致出现问题. 【纠正措施】对传入的指针应做合法性检查
IPoCPCUUserContext* pContext = pLogic->GetPoCPCUUserContext();
2015-4-20
Security Level:
公司常见软件编程低 级错误:空指针
PSST系统工程部 C语言软件编程规范工作组
HUAWEI TECHNOLOGIES CO., LTD.
Huawei Confidential
前言
这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。 C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导 致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。 业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA (汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可 以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规 则增加到了141条。 对于程序员来说,能工作的代码并不等于“好” 代码。“好”代码的指标很多,包 括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良
【举一反三】项目组必须规定统一的编程规范。维护老代码时,注意 弄清楚老代码的设计和编程的规则。
HUAWEI TECHNOLOGIES CO., LTD. Huawei Confidential
没有判断全局指针非空
【问题描述】当主控板起来但接口板还没有起来时,使用命令undo rule-map删除
所有的Rule-map,出现DA异常。
CConnectObject* pObject = pDestObject; if(CONN_CONF_REQUEST==pObject->m_ucCurConnectContext)
【举一反三】C99之前的C语言版本要求只能在作用域开始处定义变 量,这种方式在C++中已经过时。这一限制的严重问题在于, 在作用域开始时没有足够的相关信息进行初始化。因此我们只有 两种选择:要么用某个默认的空值(比如例子中的NULL)来初 始化,这通常是一种浪费,还回导致错误;要么让变量未初始化, 而这是很危险的。解决方案很简单:尽可能局部定义变量,在需 要首次使用前定义和初始化变量。
指针
... ... }
pObject 仅仅赋初始值NULL,没有真正赋值;pclint有空指针告警,被错误关闭