我的软件验证小组正在测试一段代码,如下所示:
unsigned int alarm_id;
char alarm_text[16];
static const char text_string[] = "105, Water_Boiling";
signed int arguments_satisfied =
sscanf(text_string,
"%3d, %16s",
&alarm_id, &alarm_text[0]);
if (arguments_satisfied < 2)
{
system_failure();
}
使用上面的代码片段,有没有办法让sscanf
返回大于2的值而不更改格式说明符或将参数更改为sscanf
?
他们正在使用单元测试工具执行if
语句表达式。
对于C ++,编译为C ++时,上述片段有什么不同吗? (我们计划使用相同的代码,但编译为C ++。)
仅供参考,我们正在使用带有IAR Embedded Workbench的ARM7处理器。
答案 0 :(得分:2)
sscanf返回转换的参数数量。它不能转换比你告诉它更多的参数。因此,除非更改格式字符串,否则sscanf不能返回大于2的值。一个可能的例外 - 如果在转换第一个参数之前用完数据,则可能返回EOF,但我怀疑只有适用于scanf,而不是sscanf。
答案 1 :(得分:1)
对于许多工具链(我非常确定IAR是一个),如果在目标文件和库中有符号,链接器将链接到目标文件中的符号,而不是库中的符号。
因此,您可以在测试期间提供自己的sscanf()
函数进行链接,并让它返回您喜欢的任何内容。
如果链接器在sscanf()
实现与库中的实现之间存在符号冲突问题,则替代方案可能是单元测试sscanf()
使用不同的名称(例如unittest_sscanf
)并让构建系统定义一个宏,以便在构建过程中使用类似sscanf()
的内容重命名/Dsscanf=unittest_sscanf
。
当然,确保未测试的其他sscanf()
次呼叫不会导致问题可能会非常棘手。