3

我正在尝试修复 checkmarx 工具扣除的漏洞。下面是与我目前正在处理的项目类似的示例代码,该项目在堆栈变量上引发内存泄漏和释放内存。

内存在被调用函数中分配,在 Main 函数中删除。

如果 sum 在 main 函数中分配,则不会有任何内存泄漏或堆栈变量上的内存空闲。但是我不能在我的实际代码中做同样的事情,它涉及一些其他变量来确定分配前指针变量的大小。

void addition(int *a, int *b, int** sum)
{
    *sum = new int[2]; //MEMORY LEAK is thrown here

    if (*sum)
    {
        for (int i = 0; i < 2; i++)
        {
            cout << "Enter two numbers: " <<endl;
            cin >> a[i] >> b[i];
            (*sum)[i] = a[i] + b[i];
            cout << "sum:" << (*sum)[i] << endl;

        }
    }
}

int main()
{
    int* p1 = NULL;
    p1=new int[2];
    int* p2 = NULL;
    p2 =new int[2];
    int *sum = NULL; //MemoryFree_On_StackVariable is thrown here

    addition(p1 ,p2, &sum);  

    for (int i = 0; i < 2; i++)
    {
        cout << "sum is " << sum[i] << endl;
    }
    if (p1)
    {
        delete[] p1;
        p1 = NULL;
        cout << "p1 is deleted" <<endl;
    }
    if (p2)
    {
        delete[] p2;
        p2 = NULL;
        cout << "p2 is deleted" <<endl;
    }

    if (sum != NULL)
    {
        delete[] sum;
        sum = NULL;

        cout << " sum is deleted" << endl;

    }

    return 0;
}

我该如何纠正这个漏洞?这些漏洞是否正确抛出?应该在同一个函数中分配和删除内存吗?

4

1 回答 1

1

老实说,我不知道为什么在你的情况下你有内存泄漏,因为一切似乎都是正确的(至少对我来说)。

但是如果你addition()用同一个指针多次调用sum,你肯定会造成内存泄漏(除非你delete[] sum;在每次额外调用之前没有忘记addition()),因为你打开了重新分配已经分配的内存的门,这会导致内存泄漏。

我认为这可能是在同一范围内分配/释放内存的原因。但是在你的情况下,我真的不明白。
我已经做过类似的事情(将释放任务委托给其他地方),我对此没有任何问题。


编辑:

我不知道您正在使用的 checkmarx 工具。但它似乎无法通过函数调用来保持跟踪指针。
这就是为什么它说您尝试释放main()函数中的堆栈变量以及为什么它说您不删除addition()函数中分配的变量的原因。
这解释了为什么它期望在同一个块中分配/解除分配。

据我说,你没有任何错误,但 checkmarx 没有正常工作。也许您可以改用 Valgrind 进行检查。

于 2019-08-09T12:01:27.750 回答