2

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

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,那么 n 将等于 -1,我们永远不会到达调用 foo2。这段代码是在 Linux 上运行在用户空间中的单线程进程的一部分,所以我相信除了这个进程之外,没有其他人可以在 foo1 和 foo2 的执行之间触及 k 指向的内存空间。

4

1 回答 1

3

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

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

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

它只是注意到循环体是空的并将其替换为int i = 10000000;(省略循环),然后它注意到i从未使用过并丢弃所有内容。

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

于 2013-10-14T11:52:40.803 回答