注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

利用gcc的-C保留预处理注释  

2011-09-29 22:49:24|  分类: Gcc源代码分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、问题引出

今天一个同事添加了一个新的文件,然后很自觉的对自己的文件进行lint检查,最后发现一个lint警告都没有,lint警告输出是“大地白茫茫一片真安静”。幸福来得太快太突然,同事表示无法接受没有任何警告的这个残酷现实。所以就让山人来围观一下,当然我首先是恭喜了这个位同事的卓越成绩,因为我平时写个代码能够编译通过就要该上好几次。

二、分析方法

1、追忆

突然想起这个模块里每次检测都是非常的清白,很多文件都是任何警告都没有。感觉太好了,太好就太假了。所以协助这个同事一起看看这个问题。

2、lint的源代码中禁止告警

我们知道,在lint中可以通过

lint -e xxx

的是形式来在代码中屏蔽掉某些lint告警,相当于给lint这个长舌妇缝个OK绷。

我们当时就猜测是谁在代码中屏蔽了所有的警告,所以要看到代码中所有的注释。

其实,我们通过

lint的

-p

选项将所有的lint预处理结果全部打印出来。从里面可以搜索到一个

/*lint -e* */

这是屏蔽所有警告啊,同学们,这货下手也忒狠了,而且明目张胆的放在了一个公共头文件里,导致所有包含过这个文件的lint都会失效。

3、查看定义位置

由于这个

/*lint -e* */

是放在注释中的,通过

gcc -E

之后这些注释就灰飞烟灭了。所以此时就有我们的终极法宝了,就是

gcc -C

这个是可以保留预处理的注释的,然后配合

gcc -dD -dI

显示头文件的包含关系,从而可以知道是从哪里定义的,最后顺利抓到了这个bug。收工。

大家请鼓掌。

 三、gcc相关代码分析

c_common_handle_option (size_t scode, const char *arg, int value)
    case OPT_C:
      cpp_opts->discard_comments = 0
;
      break;

    case OPT_CC:
      cpp_opts->discard_comments = 0;
      cpp_opts->discard_comments_in_macro_exp = 0;
      break;

 

_cpp_lex_direct (cpp_reader *pfile)
    if (!pfile->state.save_comments)
 {
   result->flags |= PREV_WHITE;
   goto update_tokens_line;
 }

      /* Save the comment as a token in its own right.  */
      save_comment (pfile, result, comment_start, c);
      break;

 

/* The stored comment includes the comment start and any terminator.  */
static void
save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
       cppchar_t type
)

  评论这张
 
阅读(700)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017