0

我有以下代码:

int i;
for(i=0;i<2;i++) {
  ...
  printf("i = %d\n",i);
  rtdb_pull(rtdb, buf, &ncenter);
  printf("i = %d\n",i);
  ...
}

当我运行它时,它在 i=0 时运行得很好,但是一旦 i=1,rtdb_pull 函数似乎会减少计数器,所以我最终陷入了循环。这怎么可能?我没有将 i 传递给 rtdb_pull,rtdb_pull 也没有使用名为 i 的变量。

如果我这样做,一切正常:

int i;
for(i=0;i<2;i++) {
  ...
  printf("i = %d\n",i);
  int j = i;
  rtdb_pull(rtdb, buf, &ncenter);
  i = j;
  printf("i = %d\n",i);
  ...
}

作为记录,我在 Ubuntu 13.04 上使用 gcc 4.7.3 并使用 ANSI c 进行编译。我没有从编译器收到任何相关警告。

4

4 回答 4

1

很明显这rtdb_pull()是造成这种情况的原因,否则编译器会被破坏。

发生的事情是由该函数中的编程错误引起的rtdb_pull()覆盖。i巧合i的是被覆盖0。根据事情最终在内存中的位置,您的恶意函数可能已经覆盖了其他变量,或者根本没有。

您的错误代码似乎没有覆盖j,这只是另一个巧合。

发生这种情况的地方,只有在您提供的代码rtdb_pull()加上定义和分配的代码 where rtdbbuf和时才能回答。ncenter

更改代码,如ncenter您编写的动态分配,可能会使这个问题消失。但它不会解决根本原因。所以要非常小心,它可能会再次咬人!

于 2013-08-10T05:32:30.550 回答
0

如果您的 rtdb_pull() 是非托管程序集主体的函数并且它忘记了 push-pop 备份,那么您的循环计数器(在寄存器中而不是内存中更好)可能被 rtdb_ 的汇编代码破坏。

如果程序集的寄存器备份是自动完成的,那么错误就在程序集主体之外(rtdb_pull() 可能是一个简单的 C 函数?那么错误一定是未定义的行为内存访问)

于 2013-08-09T22:33:24.373 回答
0

首先,您发布了一个代码片段,因此可能有其他原因或考虑为什么会发生这种情况!但是参数rtdb看起来像函数的地址rtdb

   rtdb_pull(rtdb, buf, &ncenter);

这是真的吗,如果是的话,是否rtdb可以访问 i?

于 2013-08-09T22:34:34.013 回答
0

由于它似乎rtdb_pull(rtdb, buf, &ncenter)将其结果写入buf,并且可能ncenter,我想看看它们是如何分配的。例如,如果buf是本地的,并且分配给它的字节太少,则该函数可能会溢出缓冲区,撞到堆栈上的其他变量,包括i. 让我们看看那些声明和相关的分配。

于 2013-08-10T01:56:09.350 回答