gpt4 book ai didi

可以在单线程进程中的两个连续 C 语句之间修改堆上的内存吗

转载 作者:太空狗 更新时间:2023-10-29 12:04:38 26 4
gpt4 key购买 nike

我对我被要求维护的源代码块运行了一个静态代码分析工具。该工具在以下情况下返回错误:

n = foo1(k);
if (n == -1)
goto err:
i = foo2(k); // k is a pointer to an integer and is allocated on the heap; i is an integer)
memcpy(x,y, i);

错误指出我可能被赋予 -1 的值,因此 memcpy 可能会导致错误(我可以提供有关如何发生的详细信息,但它们与此问题无关)

函数foo1和foo2开头都有如下代码

if (!k)
return -1;

在上面的行中,如果我们到达调用 foo2 的行,我们是否保证 k 不会为 null, 因为如果它为 NULL 那么 n 将等于 -1而且我们永远不会达到调用 foo2 的地步。这段代码是在 Linux 用户空间中运行的单线程进程的一部分,因此我相信除了这个进程之外没有其他人可以在 foo1 和 foo2 的执行之间触及 k 指向的内存空间。

最佳答案

您的问题的答案是:是的,对 foo1() 的调用可能会修改在 k 处分配的内存。

更长的答案是代码分析工具非常愚蠢。他们只能“理解”您的代码。一个著名的例子是 GCC 编译器,它执行此循环的速度比当时其他 C 编译器快数百万倍:

 int i;
for(i=0; i<10000000; i++);

它只是注意到循环体是空的,并将其替换为 int i = 10000000;(省略循环),然后它注意到从未使用过 i 并且放下一切。

但即使是非常简单的代码也会混淆代码分析工具。这就是为什么您需要学习如何正确配置它(这通常意味着将一段代码标记为“这行得通,走开”。)

关于可以在单线程进程中的两个连续 C 语句之间修改堆上的内存吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com