判断资源分配函数的返回值是否有效
2.25 ID_nullDerefAllocRet
malloc 等函数在分配失败时返回空指针,如果不加判断直接使用会导致标准未定义的行为。
在有虚拟内存支持的平台中,正常的内存分配一般不会失败,但申请内存过多或有误时(如参数为负数)也会导致分配失败,而对于没有虚拟内存支持的或可用内存有限的嵌入式系统,检查分配资源是否成功是十分重要的,所以本规则应该作为代码编写的一般性要求。
库的实现更需要注意这一点,如果库由于分配失败而使程序直接崩溃,相当于干扰了主程序的决策权,很可能会造成难以排查的问题,对于有高可靠性要求的软件,在极端环境中的行为是需要明确设定的。
示例:
void foo(size_t n) {
if (n != 0) {
char* p = (char*)malloc(n);
p[n - 1] = '\0'; // Non-compliant, check ‘p’ first
....
}
}
示例代码未检查 p 的有效性便直接使用是不符合要求的。
依据
ISO/IEC 9899:1999 7.20.3(1)
ISO/IEC 9899:2011 7.22.3(1)