adlint 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. data/AUTHORS +27 -0
  2. data/COPYING +674 -0
  3. data/ChangeLog +820 -0
  4. data/INSTALL +78 -0
  5. data/MANIFEST +464 -0
  6. data/NEWS +38 -0
  7. data/README +74 -0
  8. data/Rakefile +167 -0
  9. data/TODO +29 -0
  10. data/bin/adlint +141 -0
  11. data/bin/adlint_chk +129 -0
  12. data/bin/adlint_cma +122 -0
  13. data/bin/adlint_sma +129 -0
  14. data/bin/adlintize +286 -0
  15. data/etc/conf.d/fallback/cinit.erb +11 -0
  16. data/etc/conf.d/fallback/traits.erb +216 -0
  17. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
  18. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
  19. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
  20. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
  21. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
  22. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
  23. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
  24. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
  25. data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
  26. data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
  27. data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
  28. data/etc/conf.d/noarch/pinit.erb +11 -0
  29. data/etc/mesg.d/en_US/messages.yml +784 -0
  30. data/etc/mesg.d/ja_JP/messages.yml +784 -0
  31. data/lib/adlint/analyzer.rb +294 -0
  32. data/lib/adlint/c/branch.rb +251 -0
  33. data/lib/adlint/c/builtin.rb +92 -0
  34. data/lib/adlint/c/code.rb +490 -0
  35. data/lib/adlint/c/const.rb +465 -0
  36. data/lib/adlint/c/conv.rb +212 -0
  37. data/lib/adlint/c/ctrlexpr.rb +949 -0
  38. data/lib/adlint/c/domain.rb +7499 -0
  39. data/lib/adlint/c/environ.rb +133 -0
  40. data/lib/adlint/c/expr.rb +1725 -0
  41. data/lib/adlint/c/format.rb +3209 -0
  42. data/lib/adlint/c/interp.rb +1740 -0
  43. data/lib/adlint/c/lexer.rb +241 -0
  44. data/lib/adlint/c/mediator.rb +313 -0
  45. data/lib/adlint/c/message.rb +13597 -0
  46. data/lib/adlint/c/metric.rb +765 -0
  47. data/lib/adlint/c/object.rb +1018 -0
  48. data/lib/adlint/c/parser.rb +3800 -0
  49. data/lib/adlint/c/parser.y +2054 -0
  50. data/lib/adlint/c/phase.rb +712 -0
  51. data/lib/adlint/c/resolver.rb +270 -0
  52. data/lib/adlint/c/scanner.rb +248 -0
  53. data/lib/adlint/c/scope.rb +74 -0
  54. data/lib/adlint/c/syntax.rb +4279 -0
  55. data/lib/adlint/c/type.rb +7506 -0
  56. data/lib/adlint/c/util.rb +91 -0
  57. data/lib/adlint/c/value.rb +2310 -0
  58. data/lib/adlint/c.rb +56 -0
  59. data/lib/adlint/code.rb +500 -0
  60. data/lib/adlint/cpp/code.rb +189 -0
  61. data/lib/adlint/cpp/constexpr.rb +721 -0
  62. data/lib/adlint/cpp/constexpr.y +389 -0
  63. data/lib/adlint/cpp/eval.rb +1012 -0
  64. data/lib/adlint/cpp/lexer.rb +860 -0
  65. data/lib/adlint/cpp/macro.rb +637 -0
  66. data/lib/adlint/cpp/message.rb +992 -0
  67. data/lib/adlint/cpp/phase.rb +176 -0
  68. data/lib/adlint/cpp/scanner.rb +93 -0
  69. data/lib/adlint/cpp/source.rb +169 -0
  70. data/lib/adlint/cpp/subst.rb +300 -0
  71. data/lib/adlint/cpp/syntax.rb +1412 -0
  72. data/lib/adlint/cpp/util.rb +97 -0
  73. data/lib/adlint/cpp.rb +43 -0
  74. data/lib/adlint/driver.rb +147 -0
  75. data/lib/adlint/error.rb +179 -0
  76. data/lib/adlint/lang.rb +97 -0
  77. data/lib/adlint/ld/message.rb +259 -0
  78. data/lib/adlint/ld/metric.rb +57 -0
  79. data/lib/adlint/ld/object.rb +542 -0
  80. data/lib/adlint/ld/phase.rb +193 -0
  81. data/lib/adlint/ld/typedef.rb +109 -0
  82. data/lib/adlint/ld/util.rb +88 -0
  83. data/lib/adlint/ld.rb +37 -0
  84. data/lib/adlint/lexer.rb +293 -0
  85. data/lib/adlint/message.rb +368 -0
  86. data/lib/adlint/metric.rb +805 -0
  87. data/lib/adlint/monitor.rb +144 -0
  88. data/lib/adlint/phase.rb +90 -0
  89. data/lib/adlint/prelude.rb +314 -0
  90. data/lib/adlint/report.rb +617 -0
  91. data/lib/adlint/source.rb +155 -0
  92. data/lib/adlint/symbol.rb +127 -0
  93. data/lib/adlint/token.rb +215 -0
  94. data/lib/adlint/traits.rb +643 -0
  95. data/lib/adlint/util.rb +524 -0
  96. data/lib/adlint/version.rb +71 -0
  97. data/lib/adlint.rb +66 -0
  98. data/share/HEADER +45 -0
  99. data/share/demo/Makefile +110 -0
  100. data/share/demo/ambig_operator/ambig_operator.c +289 -0
  101. data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
  102. data/share/demo/array_range/array_range.c +62 -0
  103. data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
  104. data/share/demo/bad_brace/bad_brace.c +19 -0
  105. data/share/demo/bad_charset/abcde$.h +0 -0
  106. data/share/demo/bad_charset/bad_charset.c +22 -0
  107. data/share/demo/bad_comment/bad_comment.c +3 -0
  108. data/share/demo/bad_const/bad_const.c +19 -0
  109. data/share/demo/bad_conv/bad_conv.c +48 -0
  110. data/share/demo/bad_indent/bad_indent.c +50 -0
  111. data/share/demo/bad_init/bad_init.c +49 -0
  112. data/share/demo/bad_macro/bad_macro.c +97 -0
  113. data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
  114. data/share/demo/call_by_value/call_by_value.c +26 -0
  115. data/share/demo/cross_ref/cross_ref.c +21 -0
  116. data/share/demo/dangling_else/dangling_else.c +20 -0
  117. data/share/demo/dead_code/dead_code.c +237 -0
  118. data/share/demo/deep_nest/deep_nest.c +57 -0
  119. data/share/demo/dense_switch/dense_switch.c +62 -0
  120. data/share/demo/direct_recur/direct_recur.c +15 -0
  121. data/share/demo/div_by_zero/div_by_zero.c +35 -0
  122. data/share/demo/dos_source/dos_source.c +7 -0
  123. data/share/demo/funptr_cast/funptr_cast.c +26 -0
  124. data/share/demo/goto_stmt/goto_stmt.c +19 -0
  125. data/share/demo/id_hiding/id_hiding.c +19 -0
  126. data/share/demo/ill_defined/ill_defined.c +13 -0
  127. data/share/demo/implicit_conv/implicit_conv.c +60 -0
  128. data/share/demo/implicit_int/implicit_int.c +14 -0
  129. data/share/demo/incomplete_type/incomplete_type.c +49 -0
  130. data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
  131. data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
  132. data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
  133. data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
  134. data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
  135. data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
  136. data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
  137. data/share/demo/intro_demo/intro_demo.c +76 -0
  138. data/share/demo/intro_demo/intro_demo.h +12 -0
  139. data/share/demo/intro_demo/useless_header.h +5 -0
  140. data/share/demo/invalid_call/invalid_call.c +32 -0
  141. data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
  142. data/share/demo/line_comment/line_comment.c +12 -0
  143. data/share/demo/local_decl/local_decl.c +9 -0
  144. data/share/demo/logical_trick/logical_trick.c +36 -0
  145. data/share/demo/long_sym/long_sym.c +5 -0
  146. data/share/demo/loop_var/loop_var.c +92 -0
  147. data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
  148. data/share/demo/may_be_null/may_be_null.c +52 -0
  149. data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
  150. data/share/demo/may_be_unset/may_be_unset.c +34 -0
  151. data/share/demo/mmapped_io/mmapped_io.c +23 -0
  152. data/share/demo/multi_break/multi_break.c +33 -0
  153. data/share/demo/multi_decl/multi_decl_1.c +17 -0
  154. data/share/demo/multi_decl/multi_decl_1.h +6 -0
  155. data/share/demo/multi_decl/multi_decl_2.c +13 -0
  156. data/share/demo/multi_decl/multi_decl_2.h +6 -0
  157. data/share/demo/multi_decl/multi_decl_3.c +22 -0
  158. data/share/demo/multi_def/multi_def_1.c +36 -0
  159. data/share/demo/multi_def/multi_def_1.h +6 -0
  160. data/share/demo/multi_def/multi_def_2.c +22 -0
  161. data/share/demo/multi_def/multi_def_2.h +6 -0
  162. data/share/demo/multi_def/multi_def_3.c +6 -0
  163. data/share/demo/multi_typedef/multi_typedef.c +11 -0
  164. data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
  165. data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
  166. data/share/demo/must_be_false/must_be_false.c +53 -0
  167. data/share/demo/must_be_null/must_be_null.c +13 -0
  168. data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
  169. data/share/demo/must_be_true/must_be_true.c +21 -0
  170. data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
  171. data/share/demo/no_void_arg/no_void_arg.c +14 -0
  172. data/share/demo/null_stmt/null_stmt.c +19 -0
  173. data/share/demo/octal_const/octal_const.c +20 -0
  174. data/share/demo/output_by_param/output_by_param.c +17 -0
  175. data/share/demo/overflow/overflow.c +74 -0
  176. data/share/demo/press_release/press_release.c +40 -0
  177. data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
  178. data/share/demo/shift_expr/shift_expr.c +14 -0
  179. data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
  180. data/share/demo/static_paths/static_paths.c +153 -0
  181. data/share/demo/static_vars/static_vars.c +39 -0
  182. data/share/demo/tag_hiding/tag_hiding.c +18 -0
  183. data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
  184. data/share/demo/undefined_macro/undefined_macro.c +17 -0
  185. data/share/demo/uninit_vars/uninit_vars.c +28 -0
  186. data/share/demo/union_type/union_type.c +23 -0
  187. data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
  188. data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
  189. data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
  190. data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
  191. data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
  192. data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
  193. data/share/demo/unreachable/unreachable.c +34 -0
  194. data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
  195. data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
  196. data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
  197. data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
  198. data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
  199. data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
  200. data/share/demo/useless_expr/useless_expr.c +17 -0
  201. data/share/demo/useless_funs/useless_funs_1.c +21 -0
  202. data/share/demo/useless_funs/useless_funs_1.h +8 -0
  203. data/share/demo/useless_funs/useless_funs_2.c +6 -0
  204. data/share/demo/useless_header/useless_header.c +9 -0
  205. data/share/demo/useless_header/useless_header_1.h +12 -0
  206. data/share/demo/useless_header/useless_header_2.h +6 -0
  207. data/share/demo/useless_header/useless_header_3.h +9 -0
  208. data/share/demo/useless_header/useless_header_4.h +3 -0
  209. data/share/demo/useless_vars/useless_vars.c +17 -0
  210. data/share/demo/va_funcall/va_funcall.c +25 -0
  211. data/share/demo/various_fundef/various_fundef.c +36 -0
  212. data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
  213. data/share/demo/wrap_around/wrap_around.c +38 -0
  214. data/share/doc/Makefile +16 -0
  215. data/share/doc/adlint_on_adqua.png +0 -0
  216. data/share/doc/adlint_on_eclipse_en.png +0 -0
  217. data/share/doc/adlint_on_eclipse_ja.png +0 -0
  218. data/share/doc/adlint_on_vim_en.png +0 -0
  219. data/share/doc/adlint_on_vim_ja.png +0 -0
  220. data/share/doc/developers_guide_ja.html +171 -0
  221. data/share/doc/developers_guide_ja.texi +87 -0
  222. data/share/doc/gen_mesg_sections.rb +39 -0
  223. data/share/doc/samples/GNUmakefile +162 -0
  224. data/share/doc/samples/adlint_traits.yml +238 -0
  225. data/share/doc/texinfo.css +22 -0
  226. data/share/doc/users_guide_en.html +39975 -0
  227. data/share/doc/users_guide_en.texi +32640 -0
  228. data/share/doc/users_guide_ja.html +40505 -0
  229. data/share/doc/users_guide_ja.texi +33189 -0
  230. data/share/logo/adlint-110.png +0 -0
  231. data/share/logo/adlint-524.png +0 -0
  232. data/share/logo/adlint.svg +4637 -0
  233. data/share/sample/README +6 -0
  234. data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
  235. data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
  236. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
  237. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
  238. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
  239. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
  240. data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
  241. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
  242. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
  243. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
  244. data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
  245. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
  246. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
  247. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
  248. data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
  249. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
  250. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
  251. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
  252. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
  253. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
  254. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
  255. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
  256. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
  257. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
  258. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
  259. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
  260. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
  261. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
  262. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
  263. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
  264. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
  265. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
  353. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
  354. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
  355. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
  356. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
  357. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
  358. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
  359. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
  360. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
  361. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
  362. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
  363. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
  364. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
  365. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
  366. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
  367. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
  368. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
  369. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
  370. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
  371. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
  372. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
  373. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
  374. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
  375. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
  376. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
  377. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
  378. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
  379. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
  380. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
  381. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
  382. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
  383. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
  384. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
  385. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
  386. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
  387. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
  388. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
  389. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
  390. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
  391. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
  392. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
  393. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
  394. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
  395. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
  396. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
  397. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
  398. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
  399. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
  400. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
  401. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
  402. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
  403. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
  404. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
  405. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
  406. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
  407. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
  408. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
  409. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
  410. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
  411. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
  412. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
  413. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
  414. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
  415. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
  416. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
  417. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
  418. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
  419. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
  420. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
  421. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
  422. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
  423. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
  424. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
  425. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
  426. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
  427. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
  428. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
  429. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
  430. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
  431. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
  432. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
  433. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
  434. data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
  435. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
  436. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
  437. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
  438. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
  439. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
  440. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
  441. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
  442. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
  443. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
  444. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
  445. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
  446. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
  447. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
  448. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
  449. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
  450. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
  451. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
  452. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
  453. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
  454. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
  455. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
  456. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
  457. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
  458. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
  459. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
  460. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
  461. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
  462. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
  463. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
  464. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
  465. metadata +532 -0
@@ -0,0 +1,992 @@
1
+ # Message detection classes for C preprocessor language.
2
+ #
3
+ # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
+ # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
5
+ # License:: GPLv3+: GNU General Public License version 3 or later
6
+ #
7
+ # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
8
+
9
+ #--
10
+ # ___ ____ __ ___ _________
11
+ # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
+ # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
+ # / __ |/ /_/ / /___/ / /| / / /
14
+ # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
15
+ #
16
+ # This file is part of AdLint.
17
+ #
18
+ # AdLint is free software: you can redistribute it and/or modify it under the
19
+ # terms of the GNU General Public License as published by the Free Software
20
+ # Foundation, either version 3 of the License, or (at your option) any later
21
+ # version.
22
+ #
23
+ # AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
24
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
25
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26
+ #
27
+ # You should have received a copy of the GNU General Public License along with
28
+ # AdLint. If not, see <http://www.gnu.org/licenses/>.
29
+ #
30
+ #++
31
+
32
+ require "adlint/report"
33
+ require "adlint/message"
34
+ require "adlint/cpp/syntax"
35
+
36
+ module AdLint #:nodoc:
37
+ module Cpp #:nodoc:
38
+
39
+ class W0001 < PassiveMessageDetection
40
+ # NOTE: W0001 may be duplicative when the source file includes the same
41
+ # header which has the deeply grouped expression.
42
+ ensure_uniqueness_of :W0001
43
+
44
+ def initialize(context)
45
+ super
46
+ visitor = context[:cpp_visitor]
47
+ visitor.enter_grouped_expression += method(:enter_grouped_expression)
48
+ visitor.leave_grouped_expression += method(:leave_grouped_expression)
49
+ @group_depth = 0
50
+ end
51
+
52
+ private
53
+ def enter_grouped_expression(node)
54
+ @group_depth += 1
55
+ W(:W0001, node.location) if @group_depth == 32
56
+ end
57
+
58
+ def leave_grouped_expression(node)
59
+ @group_depth -= 1
60
+ end
61
+ end
62
+
63
+ class W0025 < PassiveMessageDetection
64
+ def initialize(context)
65
+ super
66
+ interp = context[:cpp_interpreter]
67
+ interp.on_user_header_included += method(:check_user_include)
68
+ interp.on_system_header_included += method(:check_system_include)
69
+ @user_header_fpaths = Set.new
70
+ @system_header_fpaths = Set.new
71
+ end
72
+
73
+ private
74
+ def check_user_include(user_include_line, user_header)
75
+ if @user_header_fpaths.include?(user_header.fpath)
76
+ W(:W0025, user_include_line.location)
77
+ else
78
+ if user_include_line.include_depth == 1
79
+ @user_header_fpaths.add(user_header.fpath)
80
+ end
81
+ end
82
+ end
83
+
84
+ def check_system_include(system_include_line, system_header)
85
+ if @system_header_fpaths.include?(system_header.fpath)
86
+ W(:W0025, system_include_line.location)
87
+ else
88
+ if system_include_line.include_depth == 1
89
+ @system_header_fpaths.add(system_header.fpath)
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ class W0026 < PassiveMessageDetection
96
+ def initialize(context)
97
+ super
98
+ interp = context[:cpp_interpreter]
99
+ interp.on_user_header_included += method(:check_user_include)
100
+ interp.on_system_header_included += method(:check_system_include)
101
+ @user_header_fpaths = Set.new
102
+ @system_header_fpaths = Set.new
103
+ end
104
+
105
+ private
106
+ def check_user_include(user_include_line, user_header)
107
+ if @user_header_fpaths.include?(user_header.fpath)
108
+ W(:W0026, user_include_line.location)
109
+ else
110
+ if user_include_line.include_depth > 1
111
+ @user_header_fpaths.add(user_header.fpath)
112
+ end
113
+ end
114
+ end
115
+
116
+ def check_system_include(system_include_line, system_header)
117
+ if @system_header_fpaths.include?(system_header.fpath)
118
+ W(:W0026, system_include_line.location)
119
+ else
120
+ if system_include_line.include_depth > 1
121
+ @system_header_fpaths.add(system_header.fpath)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ class W0053 < PassiveMessageDetection
128
+ def initialize(context)
129
+ super
130
+ interp = context[:cpp_interpreter]
131
+ interp.on_user_header_included += method(:check_user_include)
132
+ end
133
+
134
+ private
135
+ def check_user_include(user_include_line, user_header)
136
+ if user_include_line.include_depth == 7
137
+ W(:W0053, user_include_line.location, user_header.fpath)
138
+ end
139
+ end
140
+ end
141
+
142
+ class W0054 < PassiveMessageDetection
143
+ def initialize(context)
144
+ super
145
+ visitor = context[:cpp_visitor]
146
+ visitor.enter_if_section += method(:enter_if_section)
147
+ visitor.leave_if_section += method(:leave_if_section)
148
+ @if_depth = 0
149
+ end
150
+
151
+ private
152
+ def enter_if_section(node)
153
+ @if_depth += 1
154
+ W(:W0054, node.location) if @if_depth == 9
155
+ end
156
+
157
+ def leave_if_section(node)
158
+ @if_depth -= 1
159
+ end
160
+ end
161
+
162
+ class W0055 < PassiveMessageDetection
163
+ def initialize(context)
164
+ super
165
+ interp = context[:cpp_interpreter]
166
+ interp.on_object_like_macro_defined += method(:check)
167
+ interp.on_function_like_macro_defined += method(:check)
168
+ interp.on_va_function_like_macro_defined += method(:check)
169
+ @macro_num = 0
170
+ end
171
+
172
+ private
173
+ def check(define_line, macro)
174
+ unless in_initial_header?(define_line)
175
+ @macro_num += 1
176
+ W(:W0055, define_line.location) if @macro_num == 1025
177
+ end
178
+ end
179
+
180
+ def in_initial_header?(node)
181
+ case
182
+ when pinit_fpath = Traits.instance.of_project.initial_header
183
+ File.identical?(node.location.fpath, pinit_fpath)
184
+ when cinit_fpath = Traits.instance.of_compiler.initial_header
185
+ File.identical?(node.location.fpath, cinit_fpath)
186
+ else
187
+ false
188
+ end
189
+ end
190
+ end
191
+
192
+ class W0056 < PassiveMessageDetection
193
+ # NOTE: W0056 may be duplicative when the source file includes the same
194
+ # header which has macro definition with too many parameters.
195
+ ensure_uniqueness_of :W0056
196
+
197
+ def initialize(context)
198
+ super
199
+ interp = context[:cpp_interpreter]
200
+ interp.on_function_like_macro_defined += method(:check)
201
+ interp.on_va_function_like_macro_defined += method(:check)
202
+ end
203
+
204
+ private
205
+ def check(define_line, macro)
206
+ if macro.parameter_names.size > 31
207
+ W(:W0056, define_line.location)
208
+ end
209
+ end
210
+ end
211
+
212
+ class W0057 < PassiveMessageDetection
213
+ # NOTE: W0057 may be duplicative when the source file includes the same
214
+ # header which has macro call with too many arguments.
215
+ ensure_uniqueness_of :W0057
216
+
217
+ def initialize(context)
218
+ super
219
+ macro_table = context[:cpp_macro_table]
220
+ macro_table.on_function_like_macro_replacement += method(:check)
221
+ end
222
+
223
+ private
224
+ def check(macro, tokens)
225
+ W(:W0057, tokens.first.location) if macro.parameter_names.size > 31
226
+ end
227
+ end
228
+
229
+ class W0059 < PassiveMessageDetection
230
+ # NOTE: W0059 may be duplicative when the source file includes the same
231
+ # header which has carriage return at end of lines.
232
+ ensure_uniqueness_of :W0059
233
+
234
+ def initialize(context)
235
+ super
236
+ context[:cpp_interpreter].on_cr_at_eol_found +=
237
+ lambda { |location| W(:W0059, location) }
238
+ end
239
+ end
240
+
241
+ class W0060 < PassiveMessageDetection
242
+ # NOTE: W0060 may be duplicative when the source file includes the same
243
+ # header with the end-of-file mark.
244
+ ensure_uniqueness_of :W0060
245
+
246
+ def initialize(context)
247
+ super
248
+ context[:cpp_interpreter].on_eof_mark_at_eof_found +=
249
+ lambda { |location| W(:W0060, location) }
250
+ end
251
+ end
252
+
253
+ class W0061 < PassiveMessageDetection
254
+ # NOTE: W0061 may be duplicative when the source file includes the same
255
+ # header which has the token sequence of the compiler specific
256
+ # extension.
257
+ ensure_uniqueness_of :W0061
258
+
259
+ def initialize(context)
260
+ super
261
+ context[:c_source].on_language_extension +=
262
+ lambda { |location, matched| W(:W0061, location, matched) }
263
+ end
264
+ end
265
+
266
+ class W0069 < PassiveMessageDetection
267
+ # NOTE: W0069 may be duplicative when the source file includes the same
268
+ # header which has the nested block comment.
269
+ ensure_uniqueness_of :W0069
270
+
271
+ def initialize(context)
272
+ super
273
+ context[:cpp_interpreter].on_nested_block_comment_found +=
274
+ lambda { |location| W(:W0069, location) }
275
+ end
276
+ end
277
+
278
+ class W0072 < PassiveMessageDetection
279
+ # NOTE: W0072 may be duplicative when the source file includes the same
280
+ # header which has non basic-source-character in the #include
281
+ # directive.
282
+ ensure_uniqueness_of :W0072
283
+
284
+ def initialize(context)
285
+ super
286
+ visitor = context[:cpp_visitor]
287
+ visitor.enter_user_include_line += method(:check_user_include_line)
288
+ visitor.enter_system_include_line += method(:check_system_include_line)
289
+ end
290
+
291
+ private
292
+ def check_user_include_line(node)
293
+ unless BasicSourceCharacterSet.include?(node.header_name.value)
294
+ W(:W0072, node.header_name.location)
295
+ end
296
+ end
297
+
298
+ def check_system_include_line(node)
299
+ unless BasicSourceCharacterSet.include?(node.header_name.value)
300
+ W(:W0072, node.header_name.location)
301
+ end
302
+ end
303
+ end
304
+
305
+ class W0073 < PassiveMessageDetection
306
+ # NOTE: W0073 may be duplicative when the source file includes the same
307
+ # header without the include-guard.
308
+ ensure_uniqueness_of :W0073
309
+
310
+ def initialize(context)
311
+ super
312
+ visitor = context[:cpp_visitor]
313
+ visitor.enter_user_include_line += method(:enter_include_line)
314
+ visitor.enter_system_include_line += method(:enter_include_line)
315
+ visitor.enter_text_line += method(:enter_text_line)
316
+ visitor.enter_if_section += method(:enter_if_section)
317
+ @main_fpath = context[:sources].first.fpath
318
+ @last_fpath = nil
319
+ @enclosed_by_if_section = false
320
+ @warned_files = Set.new
321
+ end
322
+
323
+ private
324
+ def enter_include_line(node)
325
+ unless node.location.fpath == @last_fpath
326
+ @enclosed_by_if_section = false
327
+ @last_fpath = node.location.fpath
328
+ end
329
+
330
+ return if in_initial_header?(node) || in_main_file?(node)
331
+
332
+ unless @enclosed_by_if_section || in_warned_file?(node)
333
+ W(:W0073, node.location)
334
+ @warned_files.add(node.location.fpath)
335
+ end
336
+ end
337
+
338
+ def enter_text_line(node)
339
+ unless node.location.fpath == @last_fpath
340
+ @enclosed_by_if_section = false
341
+ @last_fpath = node.location.fpath
342
+ end
343
+
344
+ if empty_line?(node) || in_initial_header?(node) || in_main_file?(node)
345
+ return
346
+ end
347
+
348
+ unless @enclosed_by_if_section || in_warned_file?(node)
349
+ W(:W0073, node.location)
350
+ @warned_files.add(node.location.fpath)
351
+ end
352
+ end
353
+
354
+ def enter_if_section(node)
355
+ @enclosed_by_if_section = true
356
+ @last_fpath = node.location.fpath
357
+ end
358
+
359
+ def empty_line?(node)
360
+ node.token.value.chomp.empty?
361
+ end
362
+
363
+ def in_main_file?(node)
364
+ File.identical?(node.location.fpath, @main_fpath)
365
+ end
366
+
367
+ def in_initial_header?(node)
368
+ case
369
+ when pinit_fpath = Traits.instance.of_project.initial_header
370
+ File.identical?(node.location.fpath, pinit_fpath)
371
+ when cinit_fpath = Traits.instance.of_compiler.initial_header
372
+ File.identical?(node.location.fpath, cinit_fpath)
373
+ else
374
+ false
375
+ end
376
+ end
377
+
378
+ def in_warned_file?(node)
379
+ @warned_files.include?(node.location.fpath)
380
+ end
381
+ end
382
+
383
+ class W0442 < PassiveMessageDetection
384
+ # NOTE: W0442 may be duplicative when the source file includes the same
385
+ # header which has function-like macro definitions.
386
+ ensure_uniqueness_of :W0442
387
+
388
+ def initialize(context)
389
+ super
390
+ interp = context[:cpp_interpreter]
391
+ interp.on_function_like_macro_defined += method(:check)
392
+ interp.on_va_function_like_macro_defined += method(:check)
393
+ end
394
+
395
+ private
396
+ def check(define_line, macro)
397
+ W(:W0442, define_line.location) unless in_initial_header?(define_line)
398
+ end
399
+
400
+ def in_initial_header?(node)
401
+ case
402
+ when pinit_fpath = Traits.instance.of_project.initial_header
403
+ File.identical?(node.location.fpath, pinit_fpath)
404
+ when cinit_fpath = Traits.instance.of_compiler.initial_header
405
+ File.identical?(node.location.fpath, cinit_fpath)
406
+ else
407
+ false
408
+ end
409
+ end
410
+ end
411
+
412
+ class W0443 < PassiveMessageDetection
413
+ # NOTE: W0443 may be duplicative when the source file includes the same
414
+ # header which has functionizable function-like macro definitions.
415
+ ensure_uniqueness_of :W0443
416
+
417
+ def initialize(context)
418
+ super
419
+ visitor = context[:cpp_visitor]
420
+ visitor.enter_function_like_define_line += method(:check)
421
+ visitor.enter_va_function_like_define_line += method(:check)
422
+ end
423
+
424
+ private
425
+ def check(node)
426
+ return if in_initial_header?(node)
427
+ return unless node.identifier_list
428
+
429
+ if replacement_list = node.replacement_list
430
+ should_be_function = replacement_list.tokens.all? { |pp_token|
431
+ if keyword_or_punctuator?(pp_token)
432
+ false
433
+ elsif type_specifier_or_type_qualifier?(pp_token)
434
+ false
435
+ else
436
+ true
437
+ end
438
+ }
439
+ W(:W0443, node.location) if should_be_function
440
+ end
441
+ end
442
+
443
+ def in_initial_header?(node)
444
+ case
445
+ when pinit_fpath = Traits.instance.of_project.initial_header
446
+ File.identical?(node.location.fpath, pinit_fpath)
447
+ when cinit_fpath = Traits.instance.of_compiler.initial_header
448
+ File.identical?(node.location.fpath, cinit_fpath)
449
+ else
450
+ false
451
+ end
452
+ end
453
+
454
+ KEYWORDS = [
455
+ "sizeof", "typedef", "extern", "static", "auto", "register", "inline",
456
+ "restrict", "char", "short", "int", "long", "signed", "unsigned",
457
+ "float", "double", "const", "volatile", "void", "_Bool", "_Complex",
458
+ "_Imaginary", "struct", "union", "enum", "case", "default", "if",
459
+ "else", "switch", "while", "do", "for", "goto", "continue", "break",
460
+ "return"
461
+ ].to_set.freeze
462
+ private_constant :KEYWORDS
463
+
464
+ def keyword_or_punctuator?(pp_token)
465
+ pp_token.value == "#" || pp_token.value == "##" ||
466
+ pp_token.value == "{" || pp_token.value == "}" ||
467
+ pp_token.value == ";" || KEYWORDS.include?(pp_token.value)
468
+ end
469
+
470
+ def type_specifier_or_type_qualifier?(pp_token)
471
+ pp_token.value == "const" || pp_token.value == "volatile" ||
472
+ pp_token.value == "restrict" ||
473
+ @context[:c_type_table].all_type_names.include?(pp_token.value)
474
+ end
475
+ end
476
+
477
+ class W0444 < PassiveMessageDetection
478
+ # NOTE: W0444 may be duplicative when the source file includes the same
479
+ # header which has the function-like macro definition with `#' and
480
+ # `##' operators.
481
+ ensure_uniqueness_of :W0444
482
+
483
+ def initialize(context)
484
+ super
485
+ interp = context[:cpp_interpreter]
486
+ interp.on_function_like_macro_defined += method(:check)
487
+ interp.on_va_function_like_macro_defined += method(:check)
488
+ end
489
+
490
+ private
491
+ def check(define_line, macro)
492
+ if replacement_list = macro.replacement_list
493
+ sharp_op_num = 0
494
+ sharpsharp_op_num = 0
495
+
496
+ replacement_list.tokens.each do |pp_token|
497
+ case pp_token.value
498
+ when "#"
499
+ sharp_op_num += 1
500
+ when "##"
501
+ sharpsharp_op_num += 1
502
+ end
503
+ end
504
+
505
+ if sharp_op_num > 0 && sharpsharp_op_num > 0
506
+ W(:W0444, define_line.location)
507
+ end
508
+ end
509
+ end
510
+ end
511
+
512
+ class W0445 < PassiveMessageDetection
513
+ # NOTE: W0445 may be duplicative when the source file includes the same
514
+ # header which has the function-like macro definition with two or
515
+ # more `##' operators.
516
+ ensure_uniqueness_of :W0445
517
+
518
+ def initialize(context)
519
+ super
520
+ interp = context[:cpp_interpreter]
521
+ interp.on_function_like_macro_defined += method(:check)
522
+ interp.on_va_function_like_macro_defined += method(:check)
523
+ end
524
+
525
+ private
526
+ def check(define_line, macro)
527
+ if replacement_list = macro.replacement_list
528
+ sharpsharp_op_num = 0
529
+
530
+ replacement_list.tokens.each do |pp_token|
531
+ if pp_token.value == "##"
532
+ sharpsharp_op_num += 1
533
+ end
534
+ end
535
+
536
+ if sharpsharp_op_num > 1
537
+ W(:W0445, define_line.location)
538
+ end
539
+ end
540
+ end
541
+ end
542
+
543
+ class W0477 < PassiveMessageDetection
544
+ # NOTE: W0477 may be duplicative when the source file includes the same
545
+ # header which has the macro definition with unbalanced grouping
546
+ # tokens.
547
+ ensure_uniqueness_of :W0477
548
+
549
+ def initialize(context)
550
+ super
551
+ interp = context[:cpp_interpreter]
552
+ interp.on_object_like_macro_defined += method(:check)
553
+ interp.on_function_like_macro_defined += method(:check)
554
+ interp.on_va_function_like_macro_defined += method(:check)
555
+ end
556
+
557
+ private
558
+ def check(define_line, macro)
559
+ if replacement_list = macro.replacement_list
560
+ paren_count = 0
561
+ brace_count = 0
562
+ bracket_count = 0
563
+ replacement_list.tokens.each do |pp_token|
564
+ case pp_token.value
565
+ when "("
566
+ paren_count += 1
567
+ when ")"
568
+ paren_count -= 1
569
+ when "{"
570
+ brace_count += 1
571
+ when "}"
572
+ brace_count -= 1
573
+ when "["
574
+ bracket_count += 1
575
+ when "]"
576
+ bracket_count -= 1
577
+ end
578
+ end
579
+
580
+ unless paren_count == 0 && brace_count == 0 && bracket_count == 0
581
+ W(:W0477, define_line.location)
582
+ end
583
+ end
584
+ end
585
+ end
586
+
587
+ class W0478 < PassiveMessageDetection
588
+ # NOTE: W0478 may be duplicative when the source file includes the same
589
+ # header which has this warning.
590
+ ensure_uniqueness_of :W0478
591
+
592
+ def initialize(context)
593
+ super
594
+ visitor = context[:cpp_visitor]
595
+ visitor.enter_object_like_define_line += method(:check)
596
+ visitor.enter_function_like_define_line += method(:check)
597
+ visitor.enter_va_function_like_define_line += method(:check)
598
+ end
599
+
600
+ private
601
+ def check(node)
602
+ replacement_list = node.replacement_list
603
+ if replacement_list && replacement_list.tokens.size > 1
604
+ unless replacement_list.may_represent_expression? ||
605
+ replacement_list.may_represent_initializer? ||
606
+ replacement_list.may_represent_block? ||
607
+ replacement_list.may_represent_do_while_zero_idiom? ||
608
+ replacement_list.may_represent_specifier_qualifier_list? ||
609
+ replacement_list.may_represent_declaration_specifiers_head?
610
+ W(:W0478, node.location)
611
+ end
612
+ end
613
+ end
614
+ end
615
+
616
+ class W0479 < PassiveMessageDetection
617
+ # NOTE: W0479 may be duplicative when the source file includes the same
618
+ # header which has typdef-able macro definition.
619
+ ensure_uniqueness_of :W0479
620
+
621
+ def initialize(context)
622
+ super
623
+ visitor = context[:cpp_visitor]
624
+ visitor.enter_object_like_define_line += method(:check)
625
+ end
626
+
627
+ private
628
+ def check(node)
629
+ if replacement_list = node.replacement_list
630
+ if replacement_list.may_represent_specifier_qualifier_list?
631
+ W(:W0479, node.location)
632
+ end
633
+ end
634
+ end
635
+ end
636
+
637
+ class W0480 < PassiveMessageDetection
638
+ # NOTE: W0480 may be duplicative when the source file includes the same
639
+ # header which has this warning.
640
+ ensure_uniqueness_of :W0480
641
+
642
+ def initialize(context)
643
+ super
644
+ visitor = context[:cpp_visitor]
645
+ visitor.enter_object_like_define_line += method(:check)
646
+ visitor.enter_function_like_define_line += method(:check)
647
+ visitor.enter_va_function_like_define_line += method(:check)
648
+ end
649
+
650
+ private
651
+ def check(node)
652
+ replacement_list = node.replacement_list
653
+ if replacement_list and
654
+ replacement_list.may_represent_punctuator? ||
655
+ replacement_list.may_represent_controlling_keyword?
656
+ W(:W0480, node.location)
657
+ end
658
+ end
659
+ end
660
+
661
+ class W0481 < PassiveMessageDetection
662
+ # NOTE: W0481 may be duplicative when the source file includes the same
663
+ # header which has this warning.
664
+ ensure_uniqueness_of :W0481
665
+
666
+ def initialize(context)
667
+ super
668
+ visitor = context[:cpp_visitor]
669
+ visitor.enter_object_like_define_line += method(:check)
670
+ visitor.enter_function_like_define_line += method(:check)
671
+ visitor.enter_va_function_like_define_line += method(:check)
672
+ end
673
+
674
+ private
675
+ def check(node)
676
+ replacement_list = node.replacement_list
677
+ if replacement_list && replacement_list.may_represent_block?
678
+ W(:W0481, node.location)
679
+ end
680
+ end
681
+ end
682
+
683
+ class W0482 < PassiveMessageDetection
684
+ # NOTE: W0482 may be duplicative when the source file includes the same
685
+ # header which has this warning.
686
+ ensure_uniqueness_of :W0482
687
+
688
+ def initialize(context)
689
+ super
690
+ visitor = context[:cpp_visitor]
691
+ visitor.enter_object_like_define_line += method(:check)
692
+ end
693
+
694
+ private
695
+ def check(node)
696
+ if replacement_list = node.replacement_list
697
+ return unless replacement_list.tokens.size == 1
698
+ if type_specifier?(replacement_list.tokens.first)
699
+ W(:W0482, node.location)
700
+ end
701
+ end
702
+ end
703
+
704
+ def type_specifier?(pp_token)
705
+ case pp_token.value
706
+ when "void", "char", "short", "int", "long", "float", "double"
707
+ true
708
+ when "signed", "unsigned"
709
+ true
710
+ when "struct", "union", "enum"
711
+ true
712
+ else
713
+ false
714
+ end
715
+ end
716
+ end
717
+
718
+ class W0483 < PassiveMessageDetection
719
+ # NOTE: W0483 may be duplicative when the source file includes the same
720
+ # header which has this warning.
721
+ ensure_uniqueness_of :W0483
722
+
723
+ def initialize(context)
724
+ super
725
+ visitor = context[:cpp_visitor]
726
+ visitor.enter_object_like_define_line += method(:check)
727
+ end
728
+
729
+ private
730
+ def check(node)
731
+ if replacement_list = node.replacement_list
732
+ if replacement_list.may_represent_declaration_specifiers_head?
733
+ W(:W0483, node.location)
734
+ end
735
+ end
736
+ end
737
+ end
738
+
739
+ class W0511 < PassiveMessageDetection
740
+ # NOTE: W0511 may be duplicative when the source file includes the same
741
+ # header which has line comments.
742
+ ensure_uniqueness_of :W0511
743
+
744
+ def initialize(context)
745
+ super
746
+ context[:cpp_interpreter].on_line_comment_found +=
747
+ lambda { |comment, location| W(:W0511, location) }
748
+ end
749
+ end
750
+
751
+ class W0528 < PassiveMessageDetection
752
+ # NOTE: W0528 may be duplicative when the source file includes the same
753
+ # header which has this warning.
754
+ ensure_uniqueness_of :W0528
755
+
756
+ def initialize(context)
757
+ super
758
+ interp = context[:cpp_interpreter]
759
+ interp.on_object_like_macro_defined += method(:check)
760
+ end
761
+
762
+ private
763
+ def check(define_line, macro)
764
+ if replacement_list = macro.replacement_list
765
+ octal_token = replacement_list.tokens.find { |pp_token|
766
+ pp_token.value =~ /\A0[0-9]+[UL]*\z/i
767
+ }
768
+ W(:W0528, octal_token.location) if octal_token
769
+ end
770
+ end
771
+ end
772
+
773
+ class W0549 < PassiveMessageDetection
774
+ # NOTE: W0549 may be duplicative when the source file includes the same
775
+ # header which has this warning.
776
+ ensure_uniqueness_of :W0549
777
+
778
+ def initialize(context)
779
+ super
780
+ interp = context[:cpp_interpreter]
781
+ interp.on_function_like_macro_defined += method(:check)
782
+ interp.on_va_function_like_macro_defined += method(:check)
783
+ end
784
+
785
+ private
786
+ def check(define_line, macro)
787
+ return unless macro.replacement_list
788
+
789
+ macro.parameter_names.each do |name|
790
+ macro.replacement_list.tokens.each_with_index do |pp_token, index|
791
+ next unless pp_token.value == name
792
+
793
+ prev_token = macro.replacement_list.tokens[[index - 1, 0].max]
794
+ next_token = macro.replacement_list.tokens[index + 1]
795
+
796
+ next if prev_token && prev_token.value =~ /\A##?\z/
797
+ next if next_token && next_token.value == "##"
798
+
799
+ unless prev_token && prev_token.value == "("
800
+ W(:W0549, pp_token.location)
801
+ next
802
+ end
803
+
804
+ unless next_token && next_token.value == ")"
805
+ W(:W0549, pp_token.location)
806
+ next
807
+ end
808
+ end
809
+ end
810
+ end
811
+ end
812
+
813
+ class W0554 < PassiveMessageDetection
814
+ # NOTE: W0554 may be duplicative when the source file includes the same
815
+ # header which has this warning.
816
+ ensure_uniqueness_of :W0554
817
+
818
+ def initialize(context)
819
+ super
820
+ interp = context[:cpp_interpreter]
821
+ interp.on_unknown_pragma_evaled += method(:check)
822
+ end
823
+
824
+ private
825
+ def check(pragma_line)
826
+ W(:W0554, pragma_line.location,
827
+ pragma_line.pp_tokens.tokens.map { |token| token.value }.join(" "))
828
+ end
829
+ end
830
+
831
+ class W0574 < PassiveMessageDetection
832
+ # NOTE: W0574 may be duplicative when the source file includes the same
833
+ # header which has this warning.
834
+ ensure_uniqueness_of :W0574
835
+
836
+ def initialize(context)
837
+ super
838
+ interp = context[:cpp_interpreter]
839
+ interp.on_pp_token_extracted += method(:check_pp_token)
840
+ interp.on_object_like_macro_defined += method(:check_macro)
841
+ interp.on_function_like_macro_defined += method(:check_macro)
842
+ interp.on_va_function_like_macro_defined += method(:check_macro)
843
+ end
844
+
845
+ private
846
+ def check_pp_token(pp_token)
847
+ if pp_token.value =~ /\AL?'(.*)'\z/
848
+ unless BasicSourceCharacterSet.include?($1)
849
+ W(:W0574, pp_token.location)
850
+ end
851
+ end
852
+ end
853
+
854
+ def check_macro(define_line, macro)
855
+ if replacement_list = macro.replacement_list
856
+ replacement_list.tokens.each { |pp_token| check_pp_token(pp_token) }
857
+ end
858
+ end
859
+ end
860
+
861
+ class W0575 < PassiveMessageDetection
862
+ # NOTE: W0575 may be duplicative when the source file includes the same
863
+ # header which has this warning.
864
+ ensure_uniqueness_of :W0575
865
+
866
+ def initialize(context)
867
+ super
868
+ interp = context[:cpp_interpreter]
869
+ interp.on_pp_token_extracted += method(:check_pp_token)
870
+ interp.on_object_like_macro_defined += method(:check_macro)
871
+ interp.on_function_like_macro_defined += method(:check_macro)
872
+ interp.on_va_function_like_macro_defined += method(:check_macro)
873
+ end
874
+
875
+ private
876
+ def check_pp_token(pp_token)
877
+ if pp_token.value =~ /\AL?"(.*)"\z/
878
+ unless BasicSourceCharacterSet.include?($1)
879
+ W(:W0575, pp_token.location)
880
+ end
881
+ end
882
+ end
883
+
884
+ def check_macro(define_line, macro)
885
+ if replacement_list = macro.replacement_list
886
+ replacement_list.tokens.each { |pp_token| check_pp_token(pp_token) }
887
+ end
888
+ end
889
+ end
890
+
891
+ class W0576 < PassiveMessageDetection
892
+ # NOTE: W0576 may be duplicative when the source file includes the same
893
+ # header which has this warning.
894
+ ensure_uniqueness_of :W0576
895
+
896
+ def initialize(context)
897
+ super
898
+ interp = context[:cpp_interpreter]
899
+ interp.on_block_comment_found += method(:check)
900
+ interp.on_line_comment_found += method(:check)
901
+ @warned_chars = Set.new
902
+ end
903
+
904
+ private
905
+ def check(comment, location)
906
+ not_adapted = BasicSourceCharacterSet.select_not_adapted(comment).to_set
907
+ new_chars = not_adapted - @warned_chars
908
+
909
+ unless new_chars.empty?
910
+ W(:W0576, location, location.fpath)
911
+ @warned_chars.merge(new_chars)
912
+ end
913
+ end
914
+ end
915
+
916
+ class W0577 < PassiveMessageDetection
917
+ # NOTE: W0577 may be duplicative when the source file includes the same
918
+ # header which has this warning.
919
+ ensure_uniqueness_of :W0577
920
+
921
+ def initialize(context)
922
+ super
923
+ interp = context[:cpp_interpreter]
924
+ interp.on_unlexable_char_found += method(:check)
925
+ @warned = false
926
+ end
927
+
928
+ private
929
+ def check(char, location)
930
+ unless @warned
931
+ W(:W0577, location, location.fpath)
932
+ @warned = true
933
+ end
934
+ end
935
+ end
936
+
937
+ class W0696 < PassiveMessageDetection
938
+ # NOTE: W0696 may be duplicative when the source file includes the same
939
+ # header which has references to the undefined macro.
940
+ ensure_uniqueness_of :W0696
941
+
942
+ def initialize(context)
943
+ super
944
+ interp = context[:cpp_interpreter]
945
+ interp.on_undefined_macro_referred +=
946
+ lambda { |token| W(:W0696, token.location, token.value) }
947
+ end
948
+ end
949
+
950
+ class W0804 < PassiveMessageDetection
951
+ # NOTE: W0804 may be duplicative when the source file includes the same
952
+ # header which has this warning.
953
+ ensure_uniqueness_of :W0804
954
+
955
+ def initialize(context)
956
+ super
957
+ context[:cpp_interpreter].on_illformed_defined_op_found +=
958
+ lambda { |location| W(:W0804, location) }
959
+ end
960
+ end
961
+
962
+ class W0831 < PassiveMessageDetection
963
+ # NOTE: W0831 may be duplicative when the source file includes the same
964
+ # header which has this warning.
965
+ ensure_uniqueness_of :W0831
966
+
967
+ def initialize(context)
968
+ super
969
+ interp = context[:cpp_interpreter]
970
+ interp.on_asm_section_evaled += method(:check)
971
+ end
972
+
973
+ private
974
+ def check(asm_section)
975
+ W(:W0831, asm_section.location)
976
+ end
977
+ end
978
+
979
+ class W9002 < PassiveMessageDetection
980
+ # NOTE: W9002 may be duplicative when the source file includes the same
981
+ # header which has no newline at end of the file.
982
+ ensure_uniqueness_of :W9002
983
+
984
+ def initialize(context)
985
+ super
986
+ context[:cpp_interpreter].on_eof_newline_not_found +=
987
+ lambda { |location| W(:W9002, location) }
988
+ end
989
+ end
990
+
991
+ end
992
+ end