【发布时间】: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”。它位于应用程序代码之外(上图)。上述代码在准备接收应用软件更新设备时调用。