【问题标题】:Forcing sscanf to return more than number of arguments satisfied强制 sscanf 返回超过满足的参数数量
【发布时间】:2013-12-31 15:27:45
【问题描述】:

我的软件验证小组正在测试一段代码,如下所示:

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 处理器。

【问题讨论】:

  • 您是要让它返回大于 2,还是要确保您的 if 语句永远不会错过失败?但是,c++ 没有区别。
  • 如果text_string 的alarm_text 字段长度为16 个或更多字符,%16s 格式将在alarm_text 数组的末尾写入一个'\0'alarm_text 数组需要有 17 个元素或格式说明符需要是 %15s
  • system_failure函数中,世界爆炸了吗?
  • @BitFiddlingCodeMonkey:本质上,是的,系统的世界炸了(发送到安全的等待模式)。
  • 编译器是否可以将所有代码优化到if() 并实现arguments_satisfied 必须为2,然后优化出system_failure()

标签: c++ c scanf format-specifiers


【解决方案1】:

sscanf 返回转换的参数数量。它不能转换比你告诉它更多的参数。因此,除非更改格式字符串,否则 sscanf 不能返回大于 2 的值。一个可能的例外 - 如果在转换第一个参数之前用完数据,则可能返回 EOF,但我怀疑只有适用于 scanf,而不是 sscanf。

【讨论】:

  • 而且由于 EOF 保证为负数(即使不保证为 -1),它仍然不会返回大于 2 的值。
【解决方案2】:

对于许多工具链(我很确定 IAR 就是其中之一),如果您在目标文件和库中有符号,则链接器将链接到目标文件中的符号,而不是库中的符号.

因此,您可以提供自己的 sscanf() 函数在测试期间进行链接,并让它返回您喜欢的任何内容。

如果链接器在您的sscanf() 实现与库中的一个之间存在符号冲突问题,则可能可行的替代方法是让您对sscanf() 使用不同的名称(例如unittest_sscanf)进行单元测试并让构建系统定义一个宏以在构建过程中重命名sscanf(),对被测模块使用类似/Dsscanf=unittest_sscanf的名称。

当然,要确保其他未被测试的sscanf() 调用不会引起问题可能会很棘手。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多