Ваш вопрос не определяет, хотите ли вы заменить функцию объявление или функцию определение . Поскольку они обрабатываются Frama-C по-разному, я подробно опишу оба.
Дублирование определений на уровне ядра
В настоящее время на уровне синтаксического анализа в Frama-C нет возможности полностью игнорировать определение функции, присутствующей в одном из файлов, предоставленных для синтаксического анализа. Frama-C AST будет включать определение всех функций, которые он найдет.
Для сильных / слабых символов точного эквивалента не существует.
Если найдено второе определение для той же функции, произойдет одно из следующих действий:
Если оба определения встречаются в одном и том же модуле компиляции, возникает ошибка.
Если каждое определение происходит в отдельном модуле компиляции, Frama-C попытается найти вероятное решение:
Если оба экземпляра имеют одинаковую подпись, 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
В этом случае вам просто нужно убедиться, что нужное вам определение появится позже в списке источников для анализа.
Если экземпляры имеют разные подписи, но одна из функций фактически никогда не используется, вы можете получить предупреждение, например:
[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>
, используя вместо этого только их спецификации.