我正在寻找有关如何在不修改源代码的情况下覆盖函数的想法。就像我在原始源代码中有foo()一样,我想通过将其添加到C文件(它可能还包含其他覆盖函数)中,使用具有相同函数名的自己的版本来覆盖它。有点像强/弱编译。目前,我必须使用__FRAMAC__
进入源文件和ifdef。我不想触摸源文件。是否有一些内核选项可以不使用foo()函数的第二个实例?
答案 0 :(得分:1)
您的问题未指定是要替换函数声明还是函数定义。由于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>
的定义,而仅使用其规范。