2016-08-31 3 views
1

Мне нужно получить список всех выходов функции. Когда я использую From -plugin на следующий кодFrama-C: Получение выходных данных при использовании указателей

void add(int *sum, int a, int b) 
{ 
    *sum = a + b; 
} 

int main() 
{ 
    int result; 
    add(&result, 1, 2); 
} 

он говорит мне, что result является выход функции add. Это, конечно, правильно, но я хотел бы, чтобы плагин упоминал sum где-то. Я знаю, что sum является указателем и не изменяется в функции, поэтому он не является выходным, но *sumизменен, и я хотел бы знать это. Есть ли простой (или любой) способ достичь этого?

+2

Зачем он упоминает 'sum', который является * локальным * для функции? –

+1

@DaviD. Что такое From-plugin? –

+0

@JohnBollinger Я реализую кодовое преобразование, которое нужно делать со всеми выходными функциями перед возвратом функции. Я знаю, что 'sum' является локальным и не изменяется, но указывает на значение вне функции и это значение изменяется и, следовательно, выводит эту функцию. Поэтому было бы очень приятно, если бы '* sum' будет отображаться как результат. –

ответ

2

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

$ frama-c -main add -deps file.c 
[...] 
[from] ====== DEPENDENCIES COMPUTED ====== 
    These dependencies hold at termination for the executions that terminate: 
[from] Function add: 
    S_sum[0] FROM sum; a; b 

В основном, S_sum[0] является *sum: Value (на котором From полагается) генерирует начальное состояние в какие указатели либо NULL, либо указывают на блок с именем, похожим на один из указателей и имеющий по умолчанию два элемента. Существуют параметры командной строки для настройки поведения по умолчанию (см. Value Analysis manual для получения дополнительной информации), но вы можете узнать, что для более сложных примеров вам нужно написать (или сгенерировать) функцию-оболочку, которая будет устанавливать более сложное начальное состояние перед вызовом функции. В этом случае вам нужно будет отслеживать, какой указатель указывает на то, где для восстановления информации.

Основная часть вопроса в том, что в абстрактном состоянии Value, sum отображается на множество L возможных местоположений (здесь сводятся к одноточечному), но *sum не является объект сам по себе. Доступ к записи будет просто обновлять все значения, сопоставленные элементам L. Таким образом, с точки зрения From все выглядит как модификация result (или S_sum[0], если вы меняете точку входа).

+0

«Функция-обертка», вы имеете в виду, что я должен написать обертку вокруг 'add', где я использую известные имена для аргументов, например' add (& arg1, arg2, arg3) ', так что я могу перевести' arg1 FROM sum; а; b' to '* sum from sum; а; b'? И: применяются ли те же ограничения при использовании привязок OCaml? В любом случае, спасибо за ответ! –

+0

@DaviD. да, в этом контексте функция обертки - это функция, которая настраивает соответствующее начальное состояние и вызывает реальную точку входа анализа. Я не уверен, что вы подразумеваете под «использованием привязок OCaml». Вы хотите использовать функции 'Db.Value' и' Db.From' вместо grepping вывода? Это действительно хорошая идея, но да, действуют те же ограничения: вы не увидите там '* sum'. – Virgile