不应使用非零常量对指针赋值
14.11 ID_fixedAddrToPointer
将非零常量作为固定地址是不可移植的,且存在安全隐患。
示例:
const void* badAddr = (void*)0xffffffff; // Non-compliant
示例代码的本意是声明一个表示无效地址的值,但在 64 位系统中这个地址可能是有效的。
又如:
typedef int (*fp_t)(int);
fp_t fp = (fp_t)0x1234abcd; // Non-compliant
int res = (*fp)(123); // Unsafe
示例代码假设在特定地址可以找到特定的函数,将该地址赋给一个指针并调用,这种假设是不可移植的,也可能本身就是错误的,会导致崩溃,而且函数地址往往也属于敏感信息,不应被写入代码,否则一旦泄露,攻击者可以更改预期地址上的数据,导致恶意代码被执行。
某些框架或系统会以 -1 表示无效地址,但不具备通用性,审计工具不妨通过配置决定是否放过。
例外:
#define DEVICE_BASE ((volatile Dev*)0x1234)
volatile Dev* p = DEVICE_BASE; // Let it go if the address is right
如果固定地址受环境支持,如固定的设备地址,可不受本规则约束,但应通过接口获取地址,避免将常量地址写死在代码中。
配置
allowMinusOneAsPointerValue: 是否允许 -1 作为指针的值