主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

对空指针执行解引用

NULL 指针解引用

描述

当您将值为 NULL 的指针用作指向有效内存位置的指针时,会发生此错误。如果对零地址(如 0x00)进行解引用,Polyspace® 将空地址视为与 NULL 等价,并触发此缺陷。

风险

对空指针进行解引用是未定义行为。在大多数实现中,解引用操作可能会导致程序崩溃。

修复

在解引用指针之前,先检查该指针是否为 NULL

如果在之前已检查过 NULL 的情况下问题仍然出现,请查找检查与后续解引用操作之间的中间事件。通常,结果详细信息(或在 Polyspace as You Code 中显示的源代码提示)会显示导致缺陷的一系列事件。您可以在序列中的任何事件上实施此修复。如果结果详细信息未显示此事件历史记录,您可以使用源代码中的右键点击选项搜索与缺陷相关的变量的先前引用,并找到相关事件。另请参阅解释 Polyspace 桌面端用户界面中的 Bug Finder 结果解释 Polyspace Access Web 界面中的 Bug Finder 结果 (Polyspace Access)

请参阅以下修复示例。

扩展检查项

当输入值未知并且只有一部分输入会导致问题时,默认的 Bug Finder 分析可能不会引发此缺陷。要检查由特定系统输入值引起的缺陷,请运行更严格的 Bug Finder 分析。请参阅Extend Bug Finder Checkers to Find Defects from Specific System Input Values

示例

全部展开

#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 int* p=NULL;

 *p=arr[0];
 /* Defect: Null pointer dereference */

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

指针 p 被初始化为 NULL 的值。但是,当值 arr[0] 被写入 *p 时,p 被认为指向一个有效的内存位置。

更正 - 在解引用前为空指针分配地址

一种可能的更正方法是在解引用之前,先将 p 初始化为一个有效的内存地址。

#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 /* Fix: Assign address to null pointer */
 int* p=&arr[0];       

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

结果信息

组:静态内存
语言:C | C++
默认值:On
命令行语法:NULL_PTR
影响

版本历史记录

在 R2013b 中推出

全部展开