Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314274
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2011-01-05 18:21:17

项目中有一个Bug报出来, 说Log信息中有单词拼错了. 牵连出一个问题: 如何对项目中的注释和字符串(指literal string)做拼写检查. 这个问题看似简单, 真做起来比较麻烦.

1. 方法一, 在vim中:set spell, 用]s, [s查找下一个错误, 用z= 列出正确单词的列表选择.
   这个办法对你新写的程序有效. 经实验好用, emacs中当然有对等的办法. 对于既有项目完整地过滤一遍时,  用这个办法会很累

2. 用aspell --mode=ccpp
   aspell的单词库貌似很弱, 不能识别单词的复数形式, 和加ed的过去式等词形变化. --ignore-case 选项貌似不生效

3. 用重器1 gcc -save-temps -Wp,-CC 可以生成.i或.ii的预处理后的文件, 但带有注释, -CC 就是为了保留注释的. 这一步之后, 想办法处理.i文件从而把待处理的东西集中起来, 这个文件比原始的.c 文件规矩很多, 因为宏已经被处理了. 这一办法我没有走到底, 原因是, .c会include头文件, 头文件又会递归地include其它头文件, 系统头文件中含有很多注释. 处理头文件很麻烦.

4. 用重器2 gcc -Wa,-ahls=xxx.asm  产生对应的汇编文件, 主要想法跟3一样, 因为编译器已经走过预处理, 编译的步骤, 产生的.asm 比较规范, 容易处理, 每个程序中的字符串会在asm中有一行.string "..." 对应, 用regex容易收集. 但这一步我也没有走下去, 原因是发现在程序中连在一起的一个字符串, 在asm中可能会被分成.ascii 和 .string两个, 用这一招最好把-g关掉, 因为打开的话, gcc会有自己的一些字符串, 如"unsigned long long"

以上3和4两步,  都需要重新编译程序, 如果编译选项写死在一堆Makefile中, 就很难办, 我的办法是在幕后进行替换, 写一个cc和g++的wrapper, 检查它的所有命令行选项, 把自己想要添加的给加上, 想去掉的给去掉, 这一招很灵活, 屡试不爽, 一般人我不告诉他. 后面我把这几个脚本贴出来.

5. 用大杀器 vim 既然可以对代码进行语法高亮, 就可以检查程序中每一个字符对应的是哪个语法元素, 对于字符串, 就是cString, 它内部可能包含cSpecial(如\n\t)和cFormat(即printf中的%lld), 对注释, 就是cComment, cCommentL, cCommentStart, 下面的vim脚本可以自动收集一个程序中的注释, 或是字符串, 保存在另一个新文件中. 缺点是比较慢, 一个文件的处理, 以秒计.

我最终采取的是第5种方法. 收集后的文件, 可以用aspell集中处理, 虽然前面说过它的坏话, 词库弱.

文件:collect_string_comments.zip
大小:1KB
下载:下载

文件:spell_check.zip
大小:2KB
下载:下载


阅读(1054) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-01-06 15:05:33

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2011-01-06 15:05:33

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2011-01-06 15:05:20

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2011-01-06 15:05:20

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com