Нахождение очень похожих исполнений программы - PullRequest
2 голосов
/ 12 мая 2009

Мне было интересно, если это возможно / кто-нибудь знает какие-либо инструменты для сравнения выполнения двух связанных программ (например, заданий в классе), чтобы увидеть, насколько они похожи. Например, не для сравнения имен функций, а как они используют системные вызовы. Одним глупым случаем этого было бы тестирование, если строка C печатается как (см. Пример ниже) в более чем одном случае одной отдельной программе.

printf("%s",str)

или как

for (i=0;i<len;i++) printf("%c",str[i]);

Я не особо задумывался над этим, но я бы подумал, что strace / ltrace (возможно, даже oprofile) будет хорошей отправной точкой. В частности, это для программ UNIX C / C ++.

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 мая 2009

Если у вас есть доступ к исходному коду двух программ, вы можете построить график функций (каждая функция является узлом, и есть грань от A до B, если A вызывает B ()), и вычислить некоторые графические метрики сходства. Это отловит копию исходного кода, сделанную путем переименования и реорганизации.

1 голос
/ 12 мая 2009

Я думаю, что вы можете делать такие вещи, используя valgrind.

Более точная версия (и в зависимости от того, что является доступом к исходному коду программы и что именно вам нужно для сравнения) будет состоять в использовании kprobes.

Kernel Dynamic Probes (Kprobes) предоставляет легкий интерфейс для модулей ядра для имплантации зондов и регистрации соответствующих обработчиков зондов. Зонд - это автоматическая точка останова, которая динамически внедряется в исполняемые модули (пространство ядра) без необходимости изменять их исходный источник. Зонды предназначены для использования в качестве специальной сервисной помощи, когда требуется минимальное нарушение работы системы. Их особенно защищают в производственных средах, где использование интерактивных отладчиков нежелательно. Kprobes также широко применяется в средах тестирования и разработки. Во время теста неисправности могут быть введены или смоделированы измерительным модулем. В процессе разработки код отладки (например, printk) может быть легко вставлен без необходимости повторной компиляции в тестируемый модуль.

1 голос
/ 12 мая 2009

Первоначальной идеей было бы использовать ltrace и strace для регистрации вызовов, а затем использовать diff в журналах. Это, очевидно, будет охватывать только библиотеку, которую системные вызовы. Если вам нужна более точная гранулярная регистрация, может помочь oprofile.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...