好的,我有一个来自splash2的基准测试,我用它来测试我创建的工具。基准具有以下结构。
typedef struct _interact {
struct _interact *next ; /* Next entry of the list */
Element *destination ; /* Partner of the interaction */
float formfactor_out ; /* Form factor from this patch */
float formfactor_err ; /* Error of FF */
float area_ratio ; /* Area(this) / Area(dest) */
float visibility ; /* Visibility (0 - 1.0) */
} Interaction ;
我查了一下代码,发现面积比从来没有用过。然而,在最后,我看到面积比的值不是0,因为它是在开始。所以我在这个变量上放置了一个观察点,令人惊讶的是gdb给我指出了一个修改可见性的代码(这个变量刚好低于面积比)。
现在我的问题是为什么会这样。如何通过修改可见性来修改面积比。有什么可能?有线索吗?我真的很困惑。请注意,我正在64位计算机上测试我的程序。可能是64位和它有关,但我不知道!
代码如下:
/* Create links and finish the job */
inter = get_interaction(process_id) ;
*inter = i12 ;
inter->visibility = VISIBILITY_UNDEF ; // <---- This is what gdb is pointing to
最佳答案
啊,我明白了!实际上发生的是I12是一个局部变量,它没有初始化为0,当我们执行*inter=I12;时,I12的面积比被分配给*inter,并且由于I12的面积比是随机的,不一定是0,所以面积比的值被分配给*inter。
顺便说一下,现在我已经意识到gdb显示了在预定线下的线的行号,所以它不是指向inter->visibility=visibility_undef,而是指向line*inter=i12;