Переменная C устанавливается в 0 после перехода к функции - PullRequest
1 голос
/ 07 июля 2011

Итак, я столкнулся со странной проблемой.У меня есть указатель на структуру, и я передаю ее функции.Оказавшись внутри этой функции, одна из интересующих меня переменных выглядит равной 0, но перед передачей структуры в функцию я проверяю, чтобы убедиться, что конкретная переменная не равна 0. Странно то, что это происходит не каждый раз, толькоиногда.Кто-нибудь когда-нибудь видел что-нибудь подобное?

Исходный код:

if( expand->num == 0)
    return status;

status = decode( expand );

...


Status_type decode ( expand_type * expand )
{
    if(expand->cur_num >= expand->num) // Here is where my error occurs
                                       // 'num' is 0.
    {
    // Do stuff
    }
}

Ответы [ 3 ]

1 голос
/ 07 июля 2011

Похоже на проблему «висящего указателя»: у вас есть мошеннический указатель, который указывает на память, которая не принадлежит ему (например, не выделенный экземпляр типа, на который указывает указатель), и где-то программа инструктирует указатель использовать это «значение», и теперь указатель перезаписывает это значение (которое случайно попадает на проверяемое вами значение).

Ваши симптомы совпадают: перемежающаяся, перезапись памяти при появлении не должно быть перезаписи памяти.

Их может быть очень больно отследить, потому что вам нужно проверить целостность всех ваших операций с указателями, даже тех, которые не имеют никакого отношения к коду, который вы просматриваете в данный момент (мониторинг) .

Одна вещь, которая поможет вам отследить это, - это явная инициализация всех указателей на «ноль» при создании экземпляра. Как правило, в этом нет необходимости, но это может быть полезно для отладки, поскольку indirection-on-null обычно приводит к аварийному завершению вашей программы прямо там (что вам нужно), а не остается «скрытой проблемой», поскольку Вы получаете доступ к памяти, которая не принадлежит вам (потому что указатели в C по умолчанию не инициализируются нулем). Так, например:

int* p;   // Initialized to "garbage" memory address

... изменить на:

int* p = NULL;  // Force initialization for debugging, crashes on indirection

С другой стороны, когда вы достаточно страдаете, у вас есть привычки, которые заставляют вас очень осторожно обращаться с указателями. ; -)))

0 голосов
/ 18 июля 2011

Наконец-то нашел проблему. Существует несколько потоков, и два потока пытались получить доступ к одной и той же переменной одновременно (переменная раскрытия), в результате чего она была перезаписана! Поэтому мне пришлось остановить один из потоков в определенный момент, чтобы оба не обращались к одному и тому же материалу.

0 голосов
/ 07 июля 2011

На ум приходят три возможности.

  1. Повреждение в другой задаче.
  2. Неинициализированный указатель
  3. Повисший указатель

Из нихВ трех вариантах мои деньги (на основе текущей информации) - это неинициализированный указатель.

Я предполагаю, что значение, которое неинициализированный указатель имеет точки достаточно далеко вниз по стеку, когда вызывается decode (),память, в которой хранится «expand-> num», повреждена либо копированием параметра «расширение» в стек, либо копированием адреса возврата в стек, либо установкой кадра стека для decode ().

...