我想要一个可移植的应用程序实现。但是,我听说某些机器上的 stdlib 中的 printf 存在一些问题,它的行为与预期不符。例如,当使用转换说明符 %f 时,可能会发生在某些架构上 printf 实现在输出中包含小数点的情况!
现在我想知道,是否有一些测试例程可以用来测试 stdlib c 实现的语义正确性,特别是 printf 例程。也许有一些很好的资源可以在移植程序时指出一些问题?
非常感谢,亨氏
我想要一个可移植的应用程序实现。但是,我听说某些机器上的 stdlib 中的 printf 存在一些问题,它的行为与预期不符。例如,当使用转换说明符 %f 时,可能会发生在某些架构上 printf 实现在输出中包含小数点的情况!
现在我想知道,是否有一些测试例程可以用来测试 stdlib c 实现的语义正确性,特别是 printf 例程。也许有一些很好的资源可以在移植程序时指出一些问题?
非常感谢,亨氏
我认为Postel 法则(“在你所做的事情上保持保守,在你接受他人的事情上保持自由”)也适用于此。不要编写测试来要求逐个字符匹配以考虑printf()
实现工作。
相反,做一个更高的水平;将文本输出解析printf()
为预期的数据类型,并与该类型的值进行比较。
即,如果打印“2.25”,则解析文本(使用strtod()
或等效)并与实际数字 2.25 进行比较,而不是文本字符串“2.25”。
msvcrt dll 的 wine 测试套件看起来很有趣:http: //github.com/mirrors/wine/blob/master/dlls/msvcrt/tests/printf.c
您应该编写自己的测试套件来涵盖您所关心的问题。使用不同的输入调用 printf 100 次非常简单,输出是简单的文本,因此很容易检查您期望的输出。
我建议通过以下方式对其进行测试:使用 sprintf() 生成一些测试模板并将它们与您的“正确”模板进行比较。
我使用 fprintf 做了类似的事情(只是为了避免我们的嵌入式系统中的缓存)。
我认为 printf 和 sprintf 的结果不会有所不同:格式化算法是相同的。