Нечетность параметров в аварийных дампах Windows - PullRequest
0 голосов
/ 30 октября 2011

В аварийных дампах Windows, особенно тех, которые мы получаем из отчетов об ошибках Windows, мы часто видим значения параметров, которые варьируются в зависимости от вызовов, когда они не должны. Например:

void foo(int id)
{
    ...
{

void bar(int id)
{
    foo(id);
    ...
}

Согласно WinDbg, значения 'id' необъяснимо отличаются в foo () и bar (). Мы видим это много , и в нашем коде нет ничего, что могло бы объяснить это (IOW, мы ничего не делаем со значением 'id' до вызова foo).

У кого-нибудь есть объяснение этому?

1 Ответ

0 голосов
/ 30 октября 2011

Разрушение стека?Значения, которые вы видите, на самом деле являются значениями в стеке, и когда foo был вызван, копия была сделана только для foo, нажав на значение id, которое было в то время.Поэтому, если foo изменяет свою локальную копию, он, очевидно, будет иметь другое значение, но если кто-то запустит массив (я предполагаю, что это в C), он также может перезаписать значение id.

Так, например, предположим,тот abc вызвал foo и имел массив длины 120, объявленный локально.Кто-то имеет указатель на этот массив и копирует в него 240 байт, не замечая, что это выходит за пределы конца массива.Что ж, эти дополнительные 120 байтов окажутся поверх переменных, которые foo использует как локальные.

...