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

时间:2019-03-28 21:43:51

标签: frama-c

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

1 个答案:

答案 0 :(得分:1)

您的问题未指定是要替换函数声明还是函数定义。由于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>的定义,而仅使用其规范。