不可访问未初始化或已释放的资源
2.3 ID_illAccess
访问未初始化或已释放的资源属于逻辑错误,会导致标准未定义的行为。
资源在编程语言中往往与对象绑定:
- 对于访问未初始化的对象,本规则特化为 ID_localInitialization、ID_dynamicInitialization
- 对于解引用未初始化或已被释放的指针,本规则特化为 ID_wildPtrDeref、ID_danglingDeref
示例:
void foo(const char* path, char buf[], size_t n) {
FILE* f;
if (path != NULL) {
f = fopen(path, "rb");
}
fread(buf, 1, n, f); // Non-compliant, ‘f’ may be invalid
fclose(f);
}
当参数 path 为空时,fread 函数读取未打开的文件会导致严重错误。
又如:
void bar(FILE* f, char buf[], size_t n) {
if (feof(f)) {
fclose(f);
}
fread(buf, 1, n, f); // Non-compliant, ‘f’ may be closed
}
关闭文件后,文件对象已销毁,再次读取也会导致严重错误。
相关
依据
ISO/IEC 9899:1999 7.19.3(4)
ISO/IEC 9899:2011 7.21.3(4)