☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不可访问未初始化或已释放的资源

2.3 ID_illAccess
目录 › next › previous

访问未初始化或已释放的资源属于逻辑错误,会导致标准未定义的行为。

资源在编程语言中往往与对象绑定:

  • 对于访问未初始化的对象,本规则特化为 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
}

关闭文件后,文件对象已销毁,再次读取也会导致严重错误。

相关

ID_wildPtrDeref ID_danglingDeref ID_localInitialization ID_dynamicInitialization

依据

ISO/IEC 9899:1999 7.19.3(4) ISO/IEC 9899:2011 7.21.3(4)

参考

CWE-672 CWE-908 SEI CERT FIO46-C SEI CERT MEM30-C SEI CERT MEM50-CPP SEI CERT EXP33-C SEI CERT EXP53-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.