Вывод информации о типе из размера чтения памяти

Я использую PIN-код для инструментирования двоичного кода моего приложения и создания списка адресов (точнее, чтения памяти), созданных приложением. У меня есть процедура инструментирования, которая передает IARG_MEMORYREAD_SIZE, IARG_MEMORYREAD_EA в качестве аргументов. Однако я хочу вывести информацию о типе переменной приложения на основе читаемого объема памяти.

Например, если PIN-код наблюдает за чтением памяти из 4 байтов, как я могу сделать вывод, к какому типу данных осуществляется доступ. Это int/float? Точно так же для 8-байтовых данных, как я узнаю, являются ли данные двойной переменной или переменной типа указателя.


person user3875690    schedule 05.03.2016    source источник
comment
Вам нужно знать используемую инструкцию, а не только размер и адрес памяти. Типичный вывод компилятора будет использовать movsd/movss для загрузки FP и mov для целочисленных загрузок (в регистры gp) или movd/movq (в векторные регистры). Загрузки также могут быть операндами памяти для операций АЛУ.   -  person Peter Cordes    schedule 06.03.2016
comment
@PeterCordes, спасибо за ответ. Кажется, я получаю movss для загрузки FP только при компиляции с флагами -O1/2/3. Кажется, что обычная компиляция генерирует mov A, только dword ‹..›. Что может быть причиной это? Вы можете удалить это как комментарий и опубликовать как ответ. Я приму это :)   -  person user3875690    schedule 06.03.2016
comment
Можете ли вы опубликовать пример? Я не думаю, что gcc должен использовать mov eax, dword [mem] для загрузки числа с плавающей запятой, даже если он просто сразу же сохраняет его, не выполняя никаких математических вычислений FP. Введите или скопируйте функцию в gcc.godbolt.org и нажмите постоянную ссылку. Мой комментарий не является правильным ответом на вопрос, поскольку вы все еще не можете отличить int64_t от указателя. И некоторые компиляторы будут копировать структуры с широкими загрузками/хранениями, которые охватывают несколько более узких членов (например, int.)   -  person Peter Cordes    schedule 06.03.2016


Ответы (1)


Вы не можете определить тип операнда только по его размеру. Я даже сомневаюсь, что вы сможете сделать это надежным образом с инструкцией.

person Heyji    schedule 15.07.2016