[为清晰起见,更新了组织和内容]
真正的问题
对于C来说,帮助程序员在他/她打字的同时,对项目特定的类似printf的调试函数进行安全和正确的调用会有什么好方法?
C宏?C包装函数?代码编辑器宏或模板?其他?
背景问题和答案
许多软件使用printf或类似printf的函数进行调试,无论是出现问题时是临时还是调试日志.但它容易出错.
Q1:我们怎么知道?
A1:静态分析器有printf-mismatch错误的类别 - 这是一类常见的错误 - 我经常看到这些工具在C代码上调出这些警告.
Q2:这个错误的子类是什么?
A2:主要是格式说明符错误,格式说明符号错误.通常真正的错误是相反的:错误的变量类型,或打印输出的错误数量的变量.
Q3:我们为什么关心?
A3:充其量,会导致错误的日志记录信息并阻碍调试.最糟糕的是,崩溃软件.
问题4:有没有人试图对此问题采取任何措施?
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调用需要程序员在一行上混合变量的类型和数量,格式说明符,自由文本字符串常量和标点符号 - 所有这些看起来非常相似.
gcc提供-Wformat
警告printf/scanf/strftime/strfmon格式错误.
$ gcc -Wformat -c -o test.o test.c test.c: In function ‘main’: test.c:5: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’ $ cat test.c #includeint main(int argc, const char *argv[]) { printf("%s\n", 0); return 0; }