You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VectorCAST 6.4中C语言被测同模块函数的桩函数实现问询

VectorCAST 6.4中C语言被测同模块函数的桩函数实现问询

嘿,这个问题确实是VectorCAST新手常会踩的小坑——毕竟跨模块打桩是工具的默认顺畅路径,但同文件内的函数调用因为编译时就直接做了符号引用,处理起来得换点针对性的思路。我在汽车电子项目里用VectorCAST 6.4处理过N次这种场景,给你分享两个最靠谱、亲测有效的方案:

方案1:条件编译拆分(适合需长期保留测试钩子的场景)

如果项目允许对原代码做轻量修改,这个方案最稳定。核心思路是把需要打桩的同文件函数用条件编译包裹,测试时跳过原实现,让VectorCAST的桩函数接管:

比如你的原文件calc_module.c里有:

// 被测函数
int calculate_total(int a) {
    int base = get_base_value(); // 同文件里需要打桩的辅助函数
    return a + base;
}

// 原辅助函数
static int get_base_value() {
    // 复杂的硬件读取或计算逻辑,测试时想跳过
    return read_register(0x10);
}

修改后加上测试宏:

// 被测函数保持不变
int calculate_total(int a) {
    int base = get_base_value();
    return a + base;
}

#ifdef TEST_BUILD
// 测试模式下,只声明函数,让VectorCAST的桩来实现
static int get_base_value();
#else
// 原生产环境的实现
static int get_base_value() {
    return read_register(0x10);
}
#endif

然后在VectorCAST的测试配置里,给编译选项添加对应编译器的宏定义参数:比如GCC用-DTEST_BUILD,MSVC用/DTEST_BUILD。这样编译测试代码时,原get_base_value不会被编译,VectorCAST就能用你定义的桩函数完全替换它的调用。

方案2:VectorCAST内置内部桩(零代码修改,临时测试首选)

如果你不想碰原代码,VectorCAST 6.4的Internal Stub功能专门解决这个问题,步骤超清晰:

  1. 打开你的测试套件,切换到Stubs标签页
  2. 点击Add Stub按钮,在弹出的函数列表里找你要打桩的同文件函数——如果是static函数,记得先去Source Files里选中该C文件,勾选Expose Static Functions选项,刷新后就能看到它了
  3. 选中目标函数后,勾选Internal Stub选项,点击确定
  4. 接下来就可以在桩的编辑界面定义行为:比如固定返回某个值(比如return 100;),或者写一段模拟逻辑,甚至调用原函数的部分逻辑

这个方案的原理是VectorCAST通过编译和链接的钩子机制,把原函数的调用重定向到你定义的内部桩上,完全不需要修改生产代码,特别适合快速验证被测函数的分支逻辑。

踩过的坑提醒

  • 如果用内部桩时发现桩没生效,先检查:函数是不是被编译器优化成内联了?如果是,要在VectorCAST的编译选项里加上禁用内联的参数(比如GCC的-fno-inline
  • 对于static函数,一定要确保VectorCAST能识别到它——如果列表里找不到,就去文件属性里开Expose Static Functions
  • 两种方案选哪个?长期测试用条件编译(能和CI流水线整合),临时验证用内部桩(快)

要是还有细节没搞透,比如针对特定编译器的配置,可以再追问~

火山引擎 最新活动