Ищете идею переписать функцию во время frama-c - PullRequest
1 голос
/ 29 марта 2019

Я ищу идею о том, как переписать функцию без изменения источника. Например, если у меня есть foo () в исходном коде, я хочу перезаписать его своей собственной версией с тем же именем функции, добавив ее в файл C, который также может содержать другие функции перезаписи. Вроде как сильный / слабый сборник. В настоящее время я должен пойти в исходных файлах и ifdef с __FRAMAC__. Я не хочу трогать исходные файлы. Есть ли какая-либо опция ядра, чтобы не использовать второй экземпляр функции foo ()?

1 Ответ

1 голос
/ 29 марта 2019

Ваш вопрос не определяет, хотите ли вы заменить функцию объявление или функцию определение . Поскольку они обрабатываются Frama-C по-разному, я подробно опишу оба.

Дублирование определений на уровне ядра

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

Если найдено второе определение для той же функции, произойдет одно из следующих действий:

  1. Если оба определения встречаются в одном и том же модуле компиляции, возникает ошибка.

  2. Если каждое определение происходит в отдельном модуле компиляции, Frama-C попытается найти вероятное решение:

    1. Если оба экземпляра имеют одинаковую подпись, Frama-C выдаст предупреждение, например:

      [kernel] b.c:2: Warning: 
        dropping duplicate def'n of func f at b.c:2 in favor of that at a.c:1
      

      В этом случае вам просто нужно убедиться, что нужное вам определение появится позже в списке источников для анализа.

    2. Если экземпляры имеют разные подписи, но одна из функций фактически никогда не используется, вы можете получить предупреждение, например:

      [kernel:linker:drop-conflicting-unused] Warning: 
        Incompatible declaration for f:
        different number of arguments
        First declaration was at a.c:1
        Current declaration is at b.c:2
        Current declaration is unused, silently removing it
      

      Однако, если используются оба вхождения, появляется ошибка:

      [kernel] User Error: Incompatible declaration for f:
        different type constructors: int vs. int *
        First declaration was at a.c:1
        Current declaration is at b.c:2
      

Дубликаты объявлений на уровне ядра

С учетом объявления функции Frama-C, в соответствии со стандартом C, принимает столько их значений, сколько указано, при условии, что они совместимы. Если они имеют спецификации ACSL, эти спецификации будут объединены.

Несколько несовместимых объявлений обрабатываются, как и раньше, с предупреждениями или ошибками в зависимости от того, используются ли обе версии (в этом случае Frama-C не может выбрать).

Плагин-специфичные опции

Плагины могут иметь специальные опции для переопределения поведения функций по умолчанию в AST. Например, у Eva есть опция -eva-use-spec <fns>, которая указывает анализу игнорировать определения функций <fns>, используя вместо этого только их спецификации.

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