当前位置:  开发笔记 > 编程语言 > 正文

如何帮助程序员在C中编写安全正确的printf调用?

如何解决《如何帮助程序员在C中编写安全正确的printf调用?》经验,为你挑选了1个好方法。

[为清晰起见,更新了组织和内容]

真正的问题

对于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调用需要程序员在一行上混合变量的类型和数量,格式说明符,自由文本字符串常量和标点符号 - 所有这些看起来非常相似.



1> richq..:

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
#include 

int main(int argc, const char *argv[])
{
     printf("%s\n", 0);
     return 0;
}

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有