Это последнее время в моем списке. Короче говоря, мне нужно запустить mocked_dummy()
вместо dummy()
ON RUN-TIME, без изменения factorial()
. Меня не интересует точка входа в программное обеспечение. Я могу добавить любое количество дополнительных функций (но не могу изменить код в пределах /*---- do not modify ----*/
).Время исполнения в C?
Зачем мне это нужно?
Выполнение модульных тестов некоторых устаревших модулей C. Я знаю, что есть много инструментов, доступных во всем, но если можно было бы насмехаться во время выполнения, я могу изменить мой подход к UT (добавить многоразовые компоненты), сделать мою жизнь проще :).
Платформа/Окружающая среда?
Linux, ARM, gcc.
Подход, с которым я пытаюсь?
- Я знаю, что GDB использует ловушку/незаконные инструкции для сложения контрольных точек (gdb internals).
- Сделайте код самомодифицируемым.
- Заменить
dummy()
сегмент кода с незаконной инструкцией и return в качестве следующей следующей инструкции. - Управление передачей в ловушку.
- Trap handler - это функция многократного использования, которая читается из сокета домена unix.
- Адрес функции
mocked_dummy()
передается (читается из файла карты). - Выполнение функции фрейма.
Есть проблемы, идущие отсюда. Я также нашел подход утомительным и требует хорошего количества кодирования, некоторые в сборе тоже.
Я также нашел, под gcc каждый вызов функции может быть hooked/instrumented, но опять же не очень полезно, так как функция предназначена для издевательства, в любом случае будет выполнена.
Есть ли другой подход, который я мог бы использовать?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
}
dummy();
return fact;
}
/*---- do not modify ----*/
int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}
Будет ли приведенный выше код компилироваться, как есть? –
Обновленный код, поэтому он строит. –
Я сомневался больше в этом утверждении '#define dummy (m.dummy)' Как бы вы запретили препроцессор НЕ заменять фиктивную функцию? –