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

释放指针后应将指针赋值为空或其他有效值

14.22 ID_missingResetNull
目录 › next › previous

释放指针后,指针处于失效状态,应立即使用空指针常量或有效地址对其赋值,以避免意料之外的错误。

非空指针的有效性难以仅通过值来判断,指针失效后易被误用,尤其是全局或成员指针,因此应时刻保持指针处于有效状态,以增强程序的健壮性。本规则是避免“重复释放”和“指针悬挂”等问题的有效措施,参见 ID_doubleFree、ID_danglingDeref。

示例:

int* p;

void foo() {
    ....
    free(p);
}                 // Non-compliant

void bar() {
    if (p) {      // May be invalid
        *p = 1;
    }
}

例中 foo 函数释放指针后未将其赋值为空指针,后续对指针有效性的判断可能会是错误的,应改为:

void foo() {
    ....
    free(p);
    p = NULL;   // Compliant
}

例外:

void baz() {
    int* p = (int*)malloc(8 * sizeof(int));
    ....
    free(p);
}               // Let it go

如果非静态局部指针的生命周期在释放后立即结束,可不受本规则限制。

相关

ID_doubleFree ID_danglingDeref

参考

SEI CERT MEM01-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.