Дисбаланс стека возникает, когда структура данных, используемая для отслеживания вызываемых функций, аргументов и возвращаемых значений, становится поврежденной или смещенной.
В большинстве случаев стек является указателем памяти, в котором хранится адрес, на котором находится элемент управления.возобновится, когда текущий вызов функции будет возвращен вызывающей стороне.Существуют различные варианты этого, иногда аргументы функции также добавляются в стек, а также возвращаемое значение.Что здесь наиболее важно, так это то, что вызывающий абонент и вызываемый абонент должны договориться о том, как вернуть его в прежнее состояние после выхода вызываемого абонента.Это соглашение часто называют Соглашение о вызовах .
. В .NET дисбалансы стека являются редкой или несуществующей проблемой в чисто управляемом коде.Тем не менее, это может быть частой проблемой при вызове неуправляемого кода, так как вам нужно будет указать компилятору, как должен вызываться метод, из чего следует, как следует очищать стек в соответствии с соглашением о вызовах.
Вкл.Windows, есть несколько стандартных соглашений о вызовах, которые охватывают большую часть случаев вызова.
stdcall - Callee исправит стек при выходе.
fastcall - Потенциально нет необходимости фиксировать стек помимо адреса возврата, вместо этого регистры ЦПиспользуется для передачи аргументов.
cdecl - вызывающая сторона исправит стек после возврата вызванной функции.
Формальная ссылка доступна здесь: Соглашения о передаче и именовании аргументов @ MSDN
Это также представляет интерес: Список соглашений о вызовах X86 @ Wikipedia
В пределах данной области разработки это не является проблемой.Каждый язык обычно имеет соглашение, неявное для всех вызовов методов.C / C ++ использует то же соглашение для вызова вызовов C / C ++, Python для других вызовов Python и т. Д. При пересечении доменов это может стать проблемой, если один домен не использует то же самое, что и другой.Возможно, наиболее распространенная в Windows функция, экспортируемая с объявлениями стиля «C» (cdecl), может вызывать несбалансированный стек (или хуже) при вызове, как если бы она имела соглашение stdcall, которое является методом, распознаваемым вызовами WINAPI (система Windows).