Как значение этой переменной изменяется здесь - PullRequest
1 голос
/ 08 ноября 2011

ОК, у меня есть этот тест 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 ;

Глядя в код, я обнаружил, что area_ratio никогда не используется. Однако в итоге я вижу, что значение area_ratio не равно 0, как в начале. Поэтому я поместил точку наблюдения в эту переменную и неожиданно gdb указал мне на код, который изменяет visibility (переменная чуть ниже area_ratio ).

Теперь мой вопрос: почему это происходит? Почему area_ratio модифицируется путем модификации visibility . Каковы возможности? Любая подсказка? Я действительно озадачен. Обратите внимание, что я тестирую свою программу на 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

1 Ответ

2 голосов
/ 08 ноября 2011

Ах, я понял! На самом деле происходит то, что i12 является локальной переменной, которая не инициализируется равной 0, и когда мы выполняем * inter = i12; , area_ratio of i12 присваивается * inter , и поскольку i12 s area_ratio является случайным и необязательно 0, это значение area_ratio назначен на * inter .

И, кстати, теперь я понял, что gdb показывает номер строки, которая находится ниже предполагаемой линии, поэтому она не указывает на строку inter-> visibility = VISIBILITY_UNDEF , но линия * inter = i12 ;

...