Было бы здорово изменять тип переменной с помощью force new variable по ходу листинга. Вот здесь область стека используется, как несколько независимых переменных, а вот тут - как поля структуры. Но, по моему опыту, рано или поздно получается каша, ибо тип переменных в листинге до переопределения меняется (не всегда, но я не понял, когда именно) после переопределения. А нужно, чтобы ты самостоятельно мог указывать, на каких отрезках листинга какой тип имеют данные, расположенные по одному и тому же адресу в стеке. Конкретно в рассматриваемой выше функции _estimate (как локальная переменная) определяется ближе к концу листинга, и я подозреваю, что и в исходном коде присутствует её объявление непосредственно перед использующим её кодом. В IDA же все определения типов задаются в самом начале функции (Pascal-style), что неудобно. Огромным плюсом была бы возможность прописывать определения типов переменных вручную прямо в листинге, чтобы весь код ниже брал новое определение типа переменной, а не старое.
Если бы компилятор оптимизировал код по хардкору, то получался бы вообще нечитаемый декомпилят. Например, есть 4 байта на стеке, которые код использует как указатель на совершенно разные переменные/экземпляры классов. Вот здесь блок кода отработал с указателем на army, следующий блок работает с этими 4-мя байтами, как с указателем char**, а код после - как с указателем combatManager*. И все указатели расположены по одному и тому же адресу
* * *
Я тут подумал, что компилятор не вправе занимать место одной переменной на стеке другой переменной, если они находятся в одной и той же области видимости (scope), но может разместить новую переменную по адресу старой, которая больше не актуальна (пережила свой scope).
- Код: Выделить всё
int a;
{
int b;
}
b не может занять адрес a, ибо a потенциально может использоваться далее по коду.
А вот в случае наоборот a может быть размещена по адресу b:
- Код: Выделить всё
{
int b;
}
int a;
Получается, _estimate занимает место на стеке тех переменных, чей scope уже закончился. Надо будет поиграть с force new variable, не может быть, чтобы был такой хаос, всё-таки IDA - коммерческий продукт. И 1% нюансов декомпиляции не знаю, но было бы круто, если бы переменные объявлялись в листинге непосредственно перед первым блоком кода, который их использует.