寻找在 frama-c 期间覆盖函数的想法

Looking for idea on overwrite a function during frama-c

我正在寻找有关如何在不修改源代码的情况下覆盖函数的想法。就像我在原始源中有 foo() 一样,我想通过将它添加到 C 文件中,用我自己的具有相同函数名称的版本覆盖它,该文件可能还包含其他覆盖函数。有点像 strong/weak 编译。目前我必须使用 __FRAMAC__ 进入源文件和 ifdef。我不想触摸源文件。是否有一些内核选项不使用 foo() 函数的第二个实例?

你的问题没有具体说明你是想替换函数声明还是函数定义。由于 Frama-C 对它们的处理方式不同,我将详细介绍两者。

在内核级别重复定义

目前,在解析级别,Frama-C 中没有选项可以完全忽略存在于给定解析文件之一中的函数定义。 Frama-C AST 将合并它找到的所有函数的定义。 strong/weak 符号没有确切的等价物。

如果找到同一函数的第二个定义,将发生以下情况之一:

  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>,只使用它们的规范。