【问题标题】:CPPCheck Null pointer dereferenceCPPCheck 空指针取消引用
【发布时间】:2022-01-14 02:03:07
【问题描述】:

我维护一些嵌入式 C 代码(无操作系统)。我做了一些更新,并在我的更改上运行 CPPCheck。

CPPCheck 出现错误“空指针取消引用:(volatile unsigned int*)0”。这不在我的代码更改中,但我很想了解发生了什么。据我了解,取消引用空指针的行为是未定义的。

'''

typedef void (*pfFunc_T)( void );

/* restart bootloader */
pfFunc_T  pfFunc;

__interrupt_disable();

pfFunc  = (pfFunc_T)( ( *(volatile U32*)0 ) );   /*CPPCheck error*/

if ( pfFunc != NULL )           /* no program loaded */
{
    pfFunc();
}

'''

它是内存映射的,并且引导加载程序是第一个。会不会是从其他应用程序调用引导加载程序?

【问题讨论】:

  • 嗯,在几乎所有系统上,NULL 指针都是指向地址的指针...。因此,当您使用地址0 时,它与NULL 相同。然后取消引用该指针,导致 CPPCheck 错误。您可能需要阅读 CPPCheck 文档,看看是否可以暂时禁用该检查。
  • 您的程序是否将应用程序的入口点存储在地址0?如果您正在处理嵌入式系统,有时需要访问地址0。 Cppcheck 可能不知道这一点并发出警告。
  • 所以,仔细查看内存映射后,我认为引导加载程序位于地址“0”。它位于应用程序代码之外(上图)。上述代码在准备接收应用软件更新设备时调用。

标签: c embedded cppcheck


【解决方案1】:

我猜你正在尝试将函数指针分配给在内存地址零处找到的内容。这不适用于符合标准的编译器 - C 语言不允许访问绝对地址零,因为该地址是为空指针的特殊情况保留的。

要解决此问题,您需要将某种标识符链接到地址零,然后在源中使用该标识符。

【讨论】:

  • 稍微扩展一下,解决方案(创建“标识符”)通常通过修改链接器脚本来完成。
  • @Someprogrammerdude 许多工具链还支持使用非标准扩展在特定地址分配变量的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多