2017-01-18 10 views
-1

В основном я хочу сделать сопоставление звонящего/вызываемого, добавив проверки времени выполнения , который проверяет допустимые диапазоны перед каждым возвратом C/C++ .Сопоставьте все возвращаемые значения виртуальных функций с соответствующими адресами возврата

У меня есть прямое отображение всех отправлений виртуальных объектов на допустимые записи виртуальной таблицы для данной иерархии классов. Данные собираются во время LLVM LTO. Теперь я хочу сделать то же самое для , все возвращается к виртуальной функции. Поскольку прямое отображение сообщает мне, какие функции должны быть доступны, мне нужно определить в порядке , чтобы точно отобразить назад следующую информацию.

  1. откуда в Clang/LLVM, чтобы получить обратные адреса для каждого возвращения, содержащегося в виртуальной функции. Возможно ли получить эту информацию во время компиляции ?

  2. Как определить, в какой функции содержится определенный доход. Далее, как определить, к какому классу принадлежит эта функция?

Спасибо заранее, Пол

+0

1. Конечно, нет: адрес возврата помещается в стек во время выполнения; недоступны во время компиляции. 2. Я не могу разгадать этот вопрос. – EJP

+1

Пожалуйста, отредактируйте ваш вопрос, чтобы показать [что вы пробовали до сих пор] (http://whathaveyoutried.com). Вы должны включить [mcve] кода, с которым у вас возникают проблемы, тогда мы можем попытаться помочь с конкретной проблемой. Вы также должны прочитать [ask]. –

ответ

0

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

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

Ожидание квалифицированного точного ответа на мой пост. :)