0

在使用稍微修改过的 MobileC 构建时,我遇到了一个奇怪的问题。

我在宏中遇到分段错误,但是当我将printfs放入代码中时(否则无法调试,因为它被 C 干扰)我无法得到它发生的确切点。

这是代码:

...
printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \
...

Destroy 的代码如下:

int name##_Destroy( name##_p name ) \
{ \
printf("this will not be printed\n");    \
...

我没有修改这部分代码(除了printfs),所以我想没关系。你知道这里会发生什么吗?

4

3 回答 3

3

这段代码中有两个危险信号,但你还没有真正向我们展示足够的东西。

printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \

这显然是一个宏,但它是一个多语句宏。这是搞砸宏的最简单方法,因为它可以这样调用:

#define MACRO() puts("A"); puts("B")
// prints "B"
if (0) MACRO();

其次,那个字符串常量非常可疑:

"just to check there is no problem accessing "node" %d\n", node

请注意如何node据称是 an int,但它出现在两个字符串常量之间而没有编译错误。Anint不应该这样做,所以node可能不完全是int. 这可能是一个完整的表达,谁知道呢?

于 2013-04-08T16:46:41.383 回答
0

删除时的 Segfault 几乎总是指向损坏的堆。某些东西破坏了您的指针所在的堆(或者它正在跟踪 prev/next 指针的位置)并导致跳转到超空间。托管代码降低了这种可能性,但它仍然是我要开始的地方。

于 2013-04-08T16:41:30.873 回答
0

谢谢您的回答。现在我知道发生了什么。

Dietrich Epp,确实node不是int(我只是想知道访问它是否有问题,因为我被错误搞砸了并且不知道发生了什么)。感谢您警告我有关 C 宏的信息。我已经阅读了一些内容,最后我弄清楚了发生了什么。

node_type 类型为agent。因此宏扩展为 agent_Destroy(node)。问题是在Mobile C代码中有一个名为 agent_Destroy(agent_p agent) 的函数。发生的事情是两个函数都执行了,而第一个函数是直接在代码中定义的存在分段错误的函数。

于 2013-04-10T09:43:40.747 回答