[为清晰起见更新了组织和内容]
真正的问题
对于 C 语言来说,帮助程序员在他/她打字时编写对特定于项目的类似 printf 的调试函数的安全和正确调用的好方法是什么?
C 宏?C包装函数?代码编辑器宏或模板?其他?
背景问题和答案
许多软件使用 printf 或类似 printf 的函数进行调试,无论是在出现问题时的临时功能,还是用于调试日志。然而它很容易出错。
Q1:我们怎么知道?
A1:静态分析器有针对 printf-mismatch 错误的类别——这是一种常见的错误类别——我经常看到这些工具在 C 代码中调用这些警告。
Q2:这个错误的子类是什么?
A2:主要是格式说明符错误,格式说明符数量错误。通常真正的错误是相反的:错误的变量类型,或打印输出的变量数量错误。
Q3:我们为什么关心?
A3:充其量,导致错误的日志信息并妨碍调试。最坏的情况是软件崩溃。
Q4:有没有人尝试过解决这个问题?
A4:当然,虽然我还没有看到任何 C 语言(与 C++ 或其他语言相反),例如:
http://www.ddj.com/cpp/184401999?pgno=1 http://mi.eng.cam.ac.uk/~er258/cvd/tag/html/group__printf.html
这些产品和其他产品对我来说缺少什么,除了现在我正在研究用 C 编写的产品并且需要为 C 解决问题之外,它们是事后解决方案。他们可以避免崩溃,并且可以提供错误的警告解释,以及出了什么问题,但他们当然无法猜测程序员的意图是什么(尤其是上面的 Q&A #2)。
Q5:为什么使用 printf 这么容易出错?
A5:因为编写 printf 调用需要程序员将变量的类型和数量、格式说明符、自由文本字符串常量和标点符号(所有这些看起来非常相似)放在一行中。