Visual Studio“取消引用空指针”警告

时间:2021-02-08 22:51:12

标签: c memory sal

我有一个函数,它创建一个地址,在地址上连续存储值,然后返回地址:

double* quadratic(double a, double b, double c)
{
    double* solAddr = malloc((size_t)(2 * sizeof(double)));

    *(solAddr) = (-b + sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
    *(solAddr + 1) = (-b - sqrt(b * b - 4.0 * a * c)) / 2.0 * a;

    return solAddr;
}

但是,我收到一条警告,指出 Warning C6011 Dereferencing NULL pointer 'solAddr'。经过一些在线搜索,我发现我只需要确保 solAddr 不是带有“if”- 语句的 NULL 并且警告消失:

double* quadratic(double a, double b, double c)
{
    double* solAddr = malloc((size_t)(2 * sizeof(double)));

    if (solAddr != NULL)
    {
        *(solAddr) = (-b + sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
        *(solAddr + 1) = (-b - sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
    }

    return solAddr;
}

警告真的意味着solAddr 可能NULL吗?似乎文字另有说明。该代码在使用和不使用 NULL 检查时都适用,但我对这个警告真正想告诉我的内容感到困惑。

1 个答案:

答案 0 :(得分:1)

是的,存在该警告是因为如果分配失败,malloc 可能会返回 NULL

这实际上是来自应用于库标头的 SAL 批注的警告,而不是 Visual Studio 本身。您应该始终检查 mallocNULL 返回值并处理它,因为 malloc 可能 如果失败则返回 NULL。我常用的方法是:

   space = malloc(SIZE);
   if(NULL == space)
   {
       goto cleanup;
   }

   use(space);

cleanup:
   free(space);
   space = NULL;
相关问题