adlint 2.6.14 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. data/AUTHORS +1 -3
  2. data/ChangeLog +511 -0
  3. data/INSTALL +1 -1
  4. data/MANIFEST +57 -37
  5. data/NEWS +36 -7
  6. data/README +2 -2
  7. data/Rakefile +6 -6
  8. data/TODO +1 -1
  9. data/bin/adlint +25 -16
  10. data/bin/adlint_chk +22 -12
  11. data/bin/adlint_cma +17 -12
  12. data/bin/adlint_sma +22 -12
  13. data/bin/adlintize +98 -17
  14. data/etc/conf.d/fallback/cinit.erb +1 -1
  15. data/etc/conf.d/fallback/traits.erb +37 -37
  16. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +1 -1
  17. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +41 -41
  18. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +1 -1
  19. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +40 -40
  20. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +1 -1
  21. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +40 -40
  22. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +1 -1
  23. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +40 -40
  24. data/etc/conf.d/noarch/GNUmakefile.erb +1 -1
  25. data/etc/conf.d/noarch/adlint_all_bat.erb +1 -1
  26. data/etc/conf.d/noarch/adlint_all_sh.erb +1 -1
  27. data/etc/conf.d/noarch/pinit.erb +1 -1
  28. data/etc/conf.d/x86_64-ubuntu_12.04/cinit-gcc_4.6.3.erb +1 -1
  29. data/etc/conf.d/x86_64-ubuntu_12.04/traits-gcc_4.6.3.erb +42 -42
  30. data/etc/mesg.d/c_builtin/en_US/messages.yml +33 -33
  31. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +5 -5
  32. data/etc/mesg.d/core/en_US/messages.yml +2 -2
  33. data/etc/mesg.d/core/ja_JP/messages.yml +2 -2
  34. data/features/code_check/W0018.feature +197 -0
  35. data/features/code_check/W0019.feature +79 -0
  36. data/features/code_check/W0021.feature +81 -0
  37. data/features/code_check/W0023.feature +203 -0
  38. data/features/code_check/W0024.feature +226 -0
  39. data/features/code_check/W0025.feature +5 -0
  40. data/features/code_check/W0088.feature +2 -2
  41. data/features/code_check/W0109.feature +2 -2
  42. data/features/code_check/W0477.feature +0 -3
  43. data/features/code_check/W0478.feature +0 -1
  44. data/features/code_check/W0582.feature +3 -3
  45. data/features/code_check/W0583.feature +4 -7
  46. data/features/code_check/W0646.feature +0 -1
  47. data/features/code_check/W0695.feature +0 -1
  48. data/features/code_check/W0705.feature +8 -0
  49. data/features/code_check/W0723.feature +0 -1
  50. data/features/code_check/W0745.feature +1 -0
  51. data/features/code_check/W0781.feature +1 -0
  52. data/features/code_check/W1057.feature +141 -0
  53. data/features/code_check/W1058.feature +93 -0
  54. data/features/code_check/W1059.feature +86 -0
  55. data/features/code_check/W1060.feature +77 -0
  56. data/features/code_check/W1061.feature +143 -0
  57. data/features/code_check/W1062.feature +162 -0
  58. data/features/code_check/W1063.feature +123 -0
  59. data/features/code_check/W1064.feature +83 -0
  60. data/features/code_check/W1065.feature +82 -0
  61. data/features/code_check/W9003.feature +2 -0
  62. data/features/step_definitions/code_check_steps.rb +1 -0
  63. data/features/support/env.rb +16 -13
  64. data/lib/adlint.rb +7 -4
  65. data/lib/adlint/analyzer.rb +131 -157
  66. data/lib/adlint/annot.rb +149 -0
  67. data/lib/adlint/cc1.rb +57 -0
  68. data/lib/adlint/{c → cc1}/branch.rb +74 -62
  69. data/lib/adlint/{c → cc1}/builtin.rb +21 -21
  70. data/lib/adlint/{c → cc1}/const.rb +119 -117
  71. data/lib/adlint/{c → cc1}/conv.rb +76 -78
  72. data/lib/adlint/{c → cc1}/ctrlexpr.rb +69 -86
  73. data/lib/adlint/cc1/domain.rb +8103 -0
  74. data/lib/adlint/{c → cc1}/enum.rb +3 -3
  75. data/lib/adlint/{c → cc1}/environ.rb +21 -21
  76. data/lib/adlint/{c → cc1}/expr.rb +232 -218
  77. data/lib/adlint/{c → cc1}/format.rb +305 -342
  78. data/lib/adlint/{c → cc1}/interp.rb +269 -220
  79. data/lib/adlint/cc1/lexer.rb +246 -0
  80. data/lib/adlint/{c → cc1}/mediator.rb +78 -84
  81. data/lib/adlint/{c → cc1}/object.rb +261 -264
  82. data/lib/adlint/{c → cc1}/operator.rb +7 -7
  83. data/lib/adlint/{c → cc1}/option.rb +4 -3
  84. data/lib/adlint/{c → cc1}/parser.rb +274 -506
  85. data/lib/adlint/{c → cc1}/parser.y +69 -301
  86. data/lib/adlint/cc1/phase.rb +138 -0
  87. data/lib/adlint/{c → cc1}/resolver.rb +66 -78
  88. data/lib/adlint/{c → cc1}/scanner.rb +57 -49
  89. data/lib/adlint/{c → cc1}/scope.rb +3 -3
  90. data/lib/adlint/{c → cc1}/seqp.rb +13 -5
  91. data/lib/adlint/{c → cc1}/syntax.rb +819 -1122
  92. data/lib/adlint/{c → cc1}/type.rb +1498 -1479
  93. data/lib/adlint/{c → cc1}/util.rb +20 -12
  94. data/lib/adlint/{c → cc1}/value.rb +699 -642
  95. data/lib/adlint/code.rb +163 -164
  96. data/lib/adlint/cpp.rb +2 -2
  97. data/lib/adlint/cpp/asm.rb +13 -14
  98. data/lib/adlint/cpp/constexpr.rb +42 -38
  99. data/lib/adlint/cpp/constexpr.y +44 -40
  100. data/lib/adlint/cpp/eval.rb +435 -435
  101. data/lib/adlint/cpp/lexer.rb +343 -340
  102. data/lib/adlint/cpp/macro.rb +188 -190
  103. data/lib/adlint/cpp/phase.rb +66 -45
  104. data/lib/adlint/cpp/scanner.rb +14 -17
  105. data/lib/adlint/cpp/source.rb +49 -55
  106. data/lib/adlint/cpp/subst.rb +65 -65
  107. data/lib/adlint/cpp/syntax.rb +155 -275
  108. data/lib/adlint/cpp/util.rb +22 -19
  109. data/lib/adlint/driver.rb +86 -93
  110. data/lib/adlint/error.rb +33 -52
  111. data/lib/adlint/exam.rb +158 -24
  112. data/lib/adlint/exam/c_builtin.rb +7 -7
  113. data/lib/adlint/exam/c_builtin/cc1_check.rb +20522 -0
  114. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +957 -0
  115. data/lib/adlint/exam/c_builtin/cc1_code.rb +459 -0
  116. data/lib/adlint/exam/c_builtin/cc1_metric.rb +794 -0
  117. data/lib/adlint/exam/c_builtin/cpp_check.rb +486 -441
  118. data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +36 -39
  119. data/lib/adlint/exam/c_builtin/cpp_code.rb +63 -65
  120. data/lib/adlint/exam/c_builtin/ld_check.rb +136 -129
  121. data/lib/adlint/exam/c_builtin/ld_metric.rb +11 -11
  122. data/lib/adlint/lang.rb +25 -25
  123. data/lib/adlint/ld.rb +2 -2
  124. data/lib/adlint/ld/object.rb +220 -188
  125. data/lib/adlint/ld/phase.rb +94 -63
  126. data/lib/adlint/ld/typedef.rb +22 -11
  127. data/lib/adlint/ld/util.rb +43 -35
  128. data/lib/adlint/lexer.rb +59 -56
  129. data/lib/adlint/location.rb +140 -0
  130. data/lib/adlint/memo.rb +157 -0
  131. data/lib/adlint/message.rb +207 -156
  132. data/lib/adlint/metric.rb +139 -217
  133. data/lib/adlint/monitor.rb +45 -43
  134. data/lib/adlint/phase.rb +56 -29
  135. data/lib/adlint/prelude.rb +66 -54
  136. data/lib/adlint/report.rb +253 -332
  137. data/lib/adlint/source.rb +26 -27
  138. data/lib/adlint/supp.rb +131 -0
  139. data/lib/adlint/symbol.rb +14 -16
  140. data/lib/adlint/token.rb +19 -91
  141. data/lib/adlint/traits.rb +242 -226
  142. data/lib/adlint/util.rb +116 -205
  143. data/lib/adlint/version.rb +8 -8
  144. data/share/HEADER +2 -2
  145. data/share/doc/developers_guide_ja.html +148 -19
  146. data/share/doc/developers_guide_ja.texi +141 -11
  147. data/share/doc/samples/GNUmakefile +1 -1
  148. data/share/doc/samples/adlint_traits.yml +45 -36
  149. data/share/doc/users_guide_en.html +1321 -1252
  150. data/share/doc/users_guide_en.texi +475 -408
  151. data/share/doc/users_guide_ja.html +1932 -1878
  152. data/share/doc/users_guide_ja.texi +324 -273
  153. data/share/sample/bison-2.5/adlint/GNUmakefile +5 -1
  154. data/share/sample/bison-2.5/adlint/adlint_traits.yml +38 -38
  155. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +1 -1
  156. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +1 -1
  157. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +1 -1
  158. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +50 -42
  159. data/share/sample/bison-2.5/adlint/src/GNUmakefile +1 -1
  160. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +1 -1
  161. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +1 -1
  162. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +50 -42
  163. data/share/sample/ctags-5.8/adlint/GNUmakefile +1 -1
  164. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +1 -1
  165. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +1 -1
  166. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +50 -42
  167. data/share/sample/flex-2.5.35/adlint/GNUmakefile +1 -1
  168. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +1 -1
  169. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +1 -1
  170. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +50 -42
  171. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +1 -1
  172. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +46 -38
  173. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +1 -1
  174. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +1 -1
  175. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +1 -1
  176. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +50 -42
  177. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +1 -1
  178. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +1 -1
  179. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +1 -1
  180. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +50 -42
  181. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +1 -1
  182. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +1 -1
  183. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +1 -1
  184. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +50 -42
  185. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +1 -1
  186. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +1 -1
  187. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +1 -1
  188. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +50 -42
  189. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +1 -1
  190. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +1 -1
  191. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +1 -1
  192. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +50 -42
  193. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +1 -1
  194. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +1 -1
  195. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +1 -1
  196. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +50 -42
  197. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +1 -1
  198. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +1 -1
  199. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +1 -1
  200. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +50 -42
  201. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +1 -1
  202. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +1 -1
  203. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +1 -1
  204. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +50 -42
  205. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +1 -1
  206. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +1 -1
  207. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +1 -1
  208. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +50 -42
  209. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +1 -1
  210. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +1 -1
  211. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +1 -1
  212. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +50 -42
  213. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +1 -1
  214. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +1 -1
  215. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +1 -1
  216. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +50 -42
  217. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +1 -1
  218. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +1 -1
  219. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +1 -1
  220. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +50 -42
  221. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +1 -1
  222. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +1 -1
  223. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +1 -1
  224. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +50 -42
  225. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +1 -1
  226. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +1 -1
  227. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +1 -1
  228. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +50 -42
  229. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +1 -1
  230. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +1 -1
  231. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +1 -1
  232. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +50 -42
  233. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +1 -1
  234. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +1 -1
  235. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +1 -1
  236. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +50 -42
  237. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +1 -1
  238. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +1 -1
  239. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +1 -1
  240. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +50 -42
  241. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +1 -1
  242. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +1 -1
  243. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +1 -1
  244. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +50 -42
  245. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +1 -1
  246. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +1 -1
  247. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +1 -1
  248. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +50 -42
  249. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +1 -1
  250. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +1 -1
  251. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +1 -1
  252. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +50 -42
  253. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +1 -1
  254. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +1 -1
  255. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +1 -1
  256. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +50 -42
  257. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +1 -1
  258. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +1 -1
  259. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +1 -1
  260. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +50 -42
  261. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +1 -1
  262. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +1 -1
  263. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +1 -1
  264. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +50 -42
  265. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +1 -1
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +1 -1
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +1 -1
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +50 -42
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +1 -1
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +1 -1
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +1 -1
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +50 -42
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +1 -1
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +1 -1
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +1 -1
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +50 -42
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +1 -1
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +1 -1
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +1 -1
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +50 -42
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +1 -1
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +1 -1
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +1 -1
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +50 -42
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +1 -1
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +1 -1
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +1 -1
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +50 -42
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +1 -1
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +1 -1
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +1 -1
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +50 -42
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +1 -1
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +1 -1
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +1 -1
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +50 -42
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +1 -1
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +1 -1
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +1 -1
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +50 -42
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +1 -1
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +1 -1
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +1 -1
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +50 -42
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +1 -1
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +1 -1
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +1 -1
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +50 -42
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +1 -1
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +1 -1
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +1 -1
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +50 -42
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +1 -1
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +1 -1
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +1 -1
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +50 -42
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +1 -1
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +1 -1
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +1 -1
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +50 -42
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +1 -1
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +1 -1
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +1 -1
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +50 -42
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +1 -1
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +1 -1
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +1 -1
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +50 -42
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +1 -1
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +1 -1
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +1 -1
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +50 -42
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +1 -1
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +1 -1
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +1 -1
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +50 -42
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +1 -1
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +1 -1
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +1 -1
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +50 -42
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +1 -1
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +1 -1
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +1 -1
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +50 -42
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +1 -1
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +1 -1
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +1 -1
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +50 -42
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +1 -1
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +1 -1
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +1 -1
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +50 -42
  353. data/share/sample/screen-4.0.3/adlint/GNUmakefile +1 -1
  354. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +1 -1
  355. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +1 -1
  356. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +50 -42
  357. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +1 -1
  358. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +1 -1
  359. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +1 -1
  360. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +50 -42
  361. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +1 -1
  362. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +1 -1
  363. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +1 -1
  364. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +49 -41
  365. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +1 -1
  366. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +46 -38
  367. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +1 -1
  368. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +1 -1
  369. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +1 -1
  370. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +50 -42
  371. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +1 -1
  372. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +1 -1
  373. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +1 -1
  374. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +50 -42
  375. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +1 -1
  376. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +1 -1
  377. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +1 -1
  378. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +50 -42
  379. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +1 -1
  380. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +1 -1
  381. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +1 -1
  382. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +50 -42
  383. data/spec/adlint/{c → cc1}/ctrlexpr_spec.rb +51 -49
  384. data/spec/adlint/{c → cc1}/domain_spec.rb +210 -179
  385. data/spec/adlint/{c → cc1}/operator_spec.rb +3 -3
  386. data/spec/adlint/{c → cc1}/syntax_spec.rb +10 -12
  387. data/spec/adlint/{c → cc1}/type_spec.rb +61 -68
  388. data/{lib/adlint/c.rb → spec/adlint/location_spec.rb} +24 -29
  389. data/spec/conf.d/default_traits.yml +38 -37
  390. data/spec/conf.d/empty_cinit.h +1 -1
  391. data/spec/conf.d/empty_pinit.h +1 -1
  392. data/spec/conf.d/project/foo.c +0 -0
  393. data/spec/spec_helper.rb +2 -2
  394. metadata +60 -40
  395. data/lib/adlint/c/domain.rb +0 -7931
  396. data/lib/adlint/c/lexer.rb +0 -252
  397. data/lib/adlint/c/phase.rb +0 -135
  398. data/lib/adlint/exam/c_builtin/c_check.rb +0 -20745
  399. data/lib/adlint/exam/c_builtin/c_check_shima.rb +0 -983
  400. data/lib/adlint/exam/c_builtin/c_code.rb +0 -477
  401. data/lib/adlint/exam/c_builtin/c_metric.rb +0 -818
@@ -1,983 +0,0 @@
1
- # Code checkings (cc1-phase) of adlint-exam-c_builtin package.
2
- #
3
- # Author:: Rie Shima <mailto:rkakuuchi@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:: Rie Shima <mailto:rkakuuchi@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/exam"
33
- require "adlint/report"
34
- require "adlint/c/phase"
35
- require "adlint/c/syntax"
36
- require "adlint/c/format"
37
-
38
- module AdLint #:nodoc:
39
- module Exam #:nodoc:
40
- module CBuiltin #:nodoc:
41
-
42
- class W0573 < PassiveCodeCheck
43
- def_registrant_phase C::Prepare2Phase
44
-
45
- # NOTE: All messages of cc1-phase code check should be unique till function
46
- # step-in analysis is supported.
47
- ensure_uniqueness_of :W0573
48
-
49
- def initialize(context)
50
- super
51
- interp = context[:c_interpreter]
52
- interp.on_function_call_expr_evaled += method(:check)
53
- @environ = interp.environment
54
- end
55
-
56
- private
57
- def check(function_call_expression, function, arg_variables,
58
- result_variable)
59
- if function.named? && function.name =~ /\A.*scanf\z/
60
- format = create_format(function_call_expression,
61
- format_str_index_of(function_call_expression),
62
- arg_variables, @environ)
63
- return unless format
64
-
65
- format.conversion_specifiers.each_with_index do |cs, index|
66
- if cs.scanset && cs.scanset.include?("-")
67
- W(:W0573, format.location)
68
- break
69
- end
70
- end
71
- end
72
- end
73
-
74
- def format_str_index_of(function_call_expression)
75
- function_call_expression.argument_expressions.index do |arg_expr|
76
- arg_expr.kind_of?(C::StringLiteralSpecifier)
77
- end
78
- end
79
-
80
- def create_format(function_call_expression,
81
- format_str_index, arg_variables, environment)
82
- if format_str_index
83
- format_str =
84
- function_call_expression.argument_expressions[format_str_index]
85
- if format_str && format_str.literal.value =~ /\AL?"(.*)"\z/i
86
- location = format_str.location
87
- trailing_args = arg_variables[(format_str_index + 1)..-1] || []
88
- return C::ScanfFormat.new($1, location, trailing_args, environment)
89
- end
90
- end
91
- nil
92
- end
93
- end
94
-
95
- class W0606 < PassiveCodeCheck
96
- def_registrant_phase C::Prepare2Phase
97
-
98
- # NOTE: All messages of cc1-phase code check should be unique till function
99
- # step-in analysis is supported.
100
- ensure_uniqueness_of :W0606
101
-
102
- def initialize(context)
103
- super
104
- visitor = context[:c_visitor]
105
- visitor.enter_union_type_declaration += method(:check)
106
- end
107
-
108
- private
109
- def check(node)
110
- node.struct_declarations.each do |struct_declaration|
111
- struct_declaration.items.each do |member_decl|
112
- if member_decl.type.scalar? && member_decl.type.floating?
113
- W(:W0606, node.location)
114
- return
115
- end
116
- end
117
- end
118
- end
119
- end
120
-
121
- class W0645 < PassiveCodeCheck
122
- def_registrant_phase C::Prepare2Phase
123
-
124
- # NOTE: All messages of cc1-phase code check should be unique till function
125
- # step-in analysis is supported.
126
- ensure_uniqueness_of :W0645
127
-
128
- def initialize(context)
129
- super
130
- visitor = context[:c_visitor]
131
- visitor.enter_kandr_function_definition += method(:check)
132
- end
133
-
134
- def check(node)
135
- if node.type.parameter_types.any? { |type| type.void? }
136
- W(:W0645, node.location)
137
- end
138
- end
139
- end
140
-
141
- class W0685 < W0573
142
- def_registrant_phase C::Prepare2Phase
143
-
144
- # NOTE: All messages of cc1-phase code check should be unique till function
145
- # step-in analysis is supported.
146
- ensure_uniqueness_of :W0685
147
-
148
- def check(function_call_expression, function, arg_variables,
149
- result_variable)
150
- if function.named? && function.name =~ /\A.*scanf\z/
151
- format = create_format(function_call_expression,
152
- format_str_index_of(function_call_expression),
153
- arg_variables, @environ)
154
- return unless format
155
-
156
- format.conversion_specifiers.each do |cs|
157
- next unless cs.scanset
158
-
159
- cs.scanset.scan(/(.)-(.)/).each do |lhs, rhs|
160
- W(:W0685, format.location) if lhs.ord > rhs.ord
161
- end
162
- end
163
- end
164
- end
165
- end
166
-
167
- class W0686 < W0573
168
- def_registrant_phase C::Prepare2Phase
169
-
170
- # NOTE: All messages of cc1-phase code check should be unique till function
171
- # step-in analysis is supported.
172
- ensure_uniqueness_of :W0686
173
-
174
- def check(function_call_expression, function, arg_variables,
175
- result_variable)
176
- if function.named? && function.name =~ /\A.*scanf\z/
177
- format = create_format(function_call_expression,
178
- format_str_index_of(function_call_expression),
179
- arg_variables, @environ)
180
- return unless format
181
-
182
- format.conversion_specifiers.each do |cs|
183
- next unless cs.scanset
184
-
185
- unless cs.valid_scanset?
186
- W(:W0686, format.location)
187
- end
188
- end
189
- end
190
- end
191
- end
192
-
193
- class W0697 < PassiveCodeCheck
194
- def_registrant_phase C::Prepare2Phase
195
-
196
- # NOTE: All messages of cc1-phase code check should be unique till function
197
- # step-in analysis is supported.
198
- ensure_uniqueness_of :W0697
199
-
200
- def initialize(context)
201
- super
202
- interp = context[:c_interpreter]
203
- interp.on_function_started += method(:start_function)
204
- interp.on_function_ended += method(:end_function)
205
- interp.on_implicit_return_evaled += method(:check_implicit_return)
206
- @current_function = nil
207
- end
208
-
209
- private
210
- def start_function(function_definition, function)
211
- @current_function = function_definition
212
- end
213
-
214
- def end_function(function_definition, function)
215
- @current_function = nil
216
- end
217
-
218
- def check_implicit_return
219
- return unless @current_function
220
-
221
- unless @current_function.type.return_type.void?
222
- W(:W0697,
223
- @current_function.location, @current_function.identifier.value)
224
- end
225
- end
226
- end
227
-
228
- class W0698 < PassiveCodeCheck
229
- def_registrant_phase C::Prepare2Phase
230
-
231
- # NOTE: All messages of cc1-phase code check should be unique till function
232
- # step-in analysis is supported.
233
- ensure_uniqueness_of :W0698
234
-
235
- def initialize(context)
236
- super
237
- visitor = context[:c_visitor]
238
- visitor.enter_ansi_function_definition += method(:start_function)
239
- visitor.enter_kandr_function_definition += method(:start_function)
240
- visitor.leave_ansi_function_definition += method(:end_function)
241
- visitor.leave_kandr_function_definition += method(:end_function)
242
- visitor.enter_return_statement += method(:check)
243
- @current_function = nil
244
- end
245
-
246
- private
247
- def start_function(function_definition)
248
- @current_function = function_definition
249
- end
250
-
251
- def end_function(function_definition)
252
- @current_function = nil
253
- end
254
-
255
- def check(return_statement)
256
- return unless @current_function.explicitly_typed?
257
-
258
- if return_type = @current_function.type.return_type
259
- if !return_type.void? && return_statement.expression.nil?
260
- W(:W0698, return_statement.location,
261
- @current_function.identifier.value)
262
- end
263
- end
264
- end
265
- end
266
-
267
- class W0699 < W0698
268
- def_registrant_phase C::Prepare2Phase
269
-
270
- # NOTE: All messages of cc1-phase code check should be unique till function
271
- # step-in analysis is supported.
272
- ensure_uniqueness_of :W0699
273
-
274
- private
275
- def check(return_statement)
276
- return unless @current_function.implicitly_typed?
277
-
278
- if return_statement.expression.nil?
279
- W(:W0699, return_statement.location,
280
- @current_function.identifier.value)
281
- end
282
- end
283
- end
284
-
285
- class W0700 < PassiveCodeCheck
286
- def_registrant_phase C::Prepare2Phase
287
-
288
- # NOTE: All messages of cc1-phase code check should be unique till function
289
- # step-in analysis is supported.
290
- ensure_uniqueness_of :W0700
291
-
292
- def initialize(context)
293
- super
294
- interp = context[:c_interpreter]
295
- interp.on_function_started += method(:start_function)
296
- interp.on_function_ended += method(:end_function)
297
- interp.on_return_stmt_evaled += method(:check_explicit_return)
298
- interp.on_implicit_return_evaled += method(:check_implicit_return)
299
- @current_function = nil
300
- end
301
-
302
- private
303
- def start_function(function_definition, function)
304
- @current_function = function_definition
305
- end
306
-
307
- def end_function(function_definition, function)
308
- @current_function = nil
309
- end
310
-
311
- def check_explicit_return(return_stmt, result_variable)
312
- return unless @current_function
313
-
314
- if @current_function.implicitly_typed? && return_stmt.expression.nil?
315
- W(:W0700,
316
- @current_function.location, @current_function.identifier.value)
317
- end
318
- end
319
-
320
- def check_implicit_return
321
- return unless @current_function
322
-
323
- if @current_function.implicitly_typed?
324
- W(:W0700,
325
- @current_function.location, @current_function.identifier.value)
326
- end
327
- end
328
- end
329
-
330
- class W0711 < PassiveCodeCheck
331
- def_registrant_phase C::Prepare2Phase
332
-
333
- # NOTE: All messages of cc1-phase code check should be unique till function
334
- # step-in analysis is supported.
335
- ensure_uniqueness_of :W0711
336
-
337
- def initialize(context)
338
- super
339
- visitor = context[:c_visitor]
340
- visitor.enter_relational_expression += method(:check)
341
- end
342
-
343
- private
344
- def check(expression)
345
- if !expression.lhs_operand.logical? && expression.rhs_operand.logical?
346
- W(:W0711, expression.rhs_operand.location)
347
- end
348
- end
349
- end
350
-
351
- class W0712 < W0711
352
- def_registrant_phase C::Prepare2Phase
353
-
354
- # NOTE: All messages of cc1-phase code check should be unique till function
355
- # step-in analysis is supported.
356
- ensure_uniqueness_of :W0712
357
-
358
- private
359
- def check(expression)
360
- if expression.lhs_operand.logical? && !expression.rhs_operand.logical?
361
- W(:W0712, expression.lhs_operand.location)
362
- end
363
- end
364
- end
365
-
366
- class W0713 < W0711
367
- def_registrant_phase C::Prepare2Phase
368
-
369
- # NOTE: All messages of cc1-phase code check should be unique till function
370
- # step-in analysis is supported.
371
- ensure_uniqueness_of :W0713
372
-
373
- private
374
- def check(expression)
375
- if expression.lhs_operand.logical? && expression.rhs_operand.logical?
376
- W(:W0713, expression.location)
377
- end
378
- end
379
- end
380
-
381
- class W0714 < PassiveCodeCheck
382
- def_registrant_phase C::Prepare2Phase
383
-
384
- # NOTE: All messages of cc1-phase code check should be unique till function
385
- # step-in analysis is supported.
386
- ensure_uniqueness_of :W0714
387
-
388
- def initialize(context)
389
- super
390
- visitor = context[:c_visitor]
391
- visitor.enter_and_expression += method(:check)
392
- end
393
-
394
- private
395
- def check(expression)
396
- if expression.lhs_operand.logical? && expression.rhs_operand.logical?
397
- W(:W0714, expression.location)
398
- end
399
- end
400
- end
401
-
402
- class W0715 < PassiveCodeCheck
403
- def_registrant_phase C::Prepare2Phase
404
-
405
- # NOTE: All messages of cc1-phase code check should be unique till function
406
- # step-in analysis is supported.
407
- ensure_uniqueness_of :W0715
408
-
409
- def initialize(context)
410
- super
411
- visitor = context[:c_visitor]
412
- visitor.enter_inclusive_or_expression += method(:check)
413
- end
414
-
415
- private
416
- def check(expression)
417
- if expression.lhs_operand.logical? && expression.rhs_operand.logical?
418
- W(:W0715, expression.location)
419
- end
420
- end
421
- end
422
-
423
- class W0716 < PassiveCodeCheck
424
- def_registrant_phase C::Prepare2Phase
425
-
426
- # NOTE: All messages of cc1-phase code check should be unique till function
427
- # step-in analysis is supported.
428
- ensure_uniqueness_of :W0716
429
-
430
- def initialize(context)
431
- super
432
- visitor = context[:c_visitor]
433
- visitor.enter_additive_expression += method(:check)
434
- visitor.enter_multiplicative_expression += method(:check)
435
- visitor.enter_shift_expression += method(:check)
436
- visitor.enter_and_expression += method(:check)
437
- visitor.enter_exclusive_or_expression += method(:check)
438
- visitor.enter_inclusive_or_expression += method(:check)
439
- visitor.enter_compound_assignment_expression += lambda { |expr|
440
- case expr.operator.type
441
- when "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "^=", "|="
442
- check(expr)
443
- end
444
- }
445
- end
446
-
447
- private
448
- def check(expression)
449
- if expression.lhs_operand.logical? && expression.rhs_operand.logical?
450
- W(:W0716, expression.location)
451
- end
452
- end
453
- end
454
-
455
- class W0717 < W0716
456
- def_registrant_phase C::Prepare2Phase
457
-
458
- # NOTE: All messages of cc1-phase code check should be unique till function
459
- # step-in analysis is supported.
460
- ensure_uniqueness_of :W0717
461
-
462
- private
463
- def check(expression)
464
- if expression.lhs_operand.logical? && !expression.rhs_operand.logical?
465
- W(:W0717, expression.lhs_operand.location)
466
- end
467
- end
468
- end
469
-
470
- class W0718 < W0716
471
- def_registrant_phase C::Prepare2Phase
472
-
473
- # NOTE: All messages of cc1-phase code check should be unique till function
474
- # step-in analysis is supported.
475
- ensure_uniqueness_of :W0718
476
-
477
- private
478
- def check(expression)
479
- if !expression.lhs_operand.logical? && expression.rhs_operand.logical?
480
- W(:W0718, expression.rhs_operand.location)
481
- end
482
- end
483
- end
484
-
485
- class W0726 < W0698
486
- def_registrant_phase C::Prepare2Phase
487
-
488
- # NOTE: All messages of cc1-phase code check should be unique till function
489
- # step-in analysis is supported.
490
- ensure_uniqueness_of :W0726
491
-
492
- private
493
- def check(return_statement)
494
- return unless return_statement.expression
495
-
496
- if return_type = @current_function.type.return_type
497
- if return_type.void? && (return_type.const? || return_type.volatile?)
498
- W(:W0726, return_statement.location,
499
- @current_function.identifier.value)
500
- end
501
- end
502
- end
503
- end
504
-
505
- class W0732 < PassiveCodeCheck
506
- def_registrant_phase C::Prepare2Phase
507
-
508
- # NOTE: All messages of cc1-phase code check should be unique till function
509
- # step-in analysis is supported.
510
- ensure_uniqueness_of :W0732
511
-
512
- def initialize(context)
513
- super
514
- visitor = context[:c_visitor]
515
- visitor.enter_logical_and_expression += method(:check)
516
- end
517
-
518
- private
519
- def check(expr)
520
- if expr.lhs_operand.arithmetic? || expr.lhs_operand.bitwise?
521
- if expr.rhs_operand.arithmetic? || expr.rhs_operand.bitwise?
522
- W(:W0732, expr.location)
523
- end
524
- end
525
- end
526
- end
527
-
528
- class W0733 < PassiveCodeCheck
529
- def_registrant_phase C::Prepare2Phase
530
-
531
- # NOTE: All messages of cc1-phase code check should be unique till function
532
- # step-in analysis is supported.
533
- ensure_uniqueness_of :W0733
534
-
535
- def initialize(context)
536
- super
537
- visitor = context[:c_visitor]
538
- visitor.enter_logical_or_expression += method(:check)
539
- end
540
-
541
- private
542
- def check(expr)
543
- if expr.lhs_operand.arithmetic? || expr.lhs_operand.bitwise?
544
- if expr.rhs_operand.arithmetic? || expr.rhs_operand.bitwise?
545
- W(:W0733, expr.location)
546
- end
547
- end
548
- end
549
- end
550
-
551
- class W0734 < PassiveCodeCheck
552
- def_registrant_phase C::Prepare2Phase
553
-
554
- # NOTE: All messages of cc1-phase code check should be unique till function
555
- # step-in analysis is supported.
556
- ensure_uniqueness_of :W0734
557
-
558
- def initialize(context)
559
- super
560
- visitor = context[:c_visitor]
561
- visitor.enter_logical_and_expression += method(:check)
562
- visitor.enter_logical_or_expression += method(:check)
563
- end
564
-
565
- private
566
- def check(expr)
567
- if expr.lhs_operand.arithmetic? || expr.lhs_operand.bitwise?
568
- unless expr.rhs_operand.arithmetic? || expr.rhs_operand.bitwise?
569
- W(:W0734, expr.lhs_operand.location)
570
- end
571
- end
572
- end
573
- end
574
-
575
- class W0735 < W0734
576
- def_registrant_phase C::Prepare2Phase
577
-
578
- # NOTE: All messages of cc1-phase code check should be unique till function
579
- # step-in analysis is supported.
580
- ensure_uniqueness_of :W0735
581
-
582
- private
583
- def check(expr)
584
- if expr.rhs_operand.arithmetic? || expr.rhs_operand.bitwise?
585
- unless expr.lhs_operand.arithmetic? || expr.lhs_operand.bitwise?
586
- W(:W0735, expr.rhs_operand.location)
587
- end
588
- end
589
- end
590
- end
591
-
592
- class W0781 < PassiveCodeCheck
593
- def_registrant_phase C::Prepare2Phase
594
-
595
- # NOTE: All messages of cc1-phase code check should be unique till function
596
- # step-in analysis is supported.
597
- ensure_uniqueness_of :W0781
598
-
599
- def initialize(context)
600
- super
601
- visitor = context[:c_visitor]
602
- visitor.enter_switch_statement += method(:enter_switch_statement)
603
- visitor.leave_switch_statement += method(:check)
604
- visitor.enter_case_labeled_statement += method(:add_exec_path)
605
- visitor.enter_default_labeled_statement += method(:add_exec_path)
606
- @exec_path_nums = []
607
- end
608
-
609
- private
610
- def enter_switch_statement(node)
611
- @exec_path_nums.push(0)
612
- end
613
-
614
- def check(node)
615
- if exec_path_num = @exec_path_nums.last and exec_path_num < 2
616
- W(:W0781, node.location)
617
- end
618
- @exec_path_nums.pop
619
- end
620
-
621
- def add_exec_path(node)
622
- @exec_path_nums[-1] += 1 if node.executed?
623
- end
624
- end
625
-
626
- class W0801 < PassiveCodeCheck
627
- def_registrant_phase C::Prepare2Phase
628
-
629
- # NOTE: All messages of cc1-phase code check should be unique till function
630
- # step-in analysis is supported.
631
- ensure_uniqueness_of :W0801
632
-
633
- def initialize(context)
634
- super
635
- visitor = context[:c_visitor]
636
- visitor.enter_struct_type_declaration += method(:check)
637
- visitor.enter_union_type_declaration += method(:check)
638
- end
639
-
640
- private
641
- def check(node)
642
- W(:W0801, node.location) if node.type.members.empty?
643
- end
644
- end
645
-
646
- class W0809 < PassiveCodeCheck
647
- def_registrant_phase C::Prepare2Phase
648
-
649
- # NOTE: All messages of cc1-phase code check should be unique till function
650
- # step-in analysis is supported.
651
- ensure_uniqueness_of :W0809
652
-
653
- def initialize(context)
654
- super
655
- visitor = context[:c_visitor]
656
- visitor.enter_function_declaration += method(:check_function_name)
657
- visitor.enter_variable_declaration += method(:check_variable_name)
658
- visitor.enter_variable_definition += method(:check_variable_name)
659
- visitor.enter_parameter_definition += method(:check_variable_name)
660
- visitor.enter_typedef_declaration += method(:check_typedef_name)
661
- visitor.enter_struct_type_declaration += method(:check_tag_name)
662
- visitor.enter_union_type_declaration += method(:check_tag_name)
663
- visitor.enter_enum_type_declaration += method(:check_tag_name)
664
- visitor.enter_enumerator += method(:check_enumerator_name)
665
- visitor.enter_kandr_function_definition += method(:enter_function)
666
- visitor.enter_ansi_function_definition += method(:enter_function)
667
- visitor.leave_kandr_function_definition += method(:leave_function)
668
- visitor.leave_ansi_function_definition += method(:leave_function)
669
- @function_def_level = 0
670
- end
671
-
672
- private
673
- def check_function_name(function_decl)
674
- check_object_name(function_decl)
675
- end
676
-
677
- def check_variable_name(variable_decl_or_def)
678
- check_object_name(variable_decl_or_def)
679
- end
680
-
681
- def check_typedef_name(typedef_decl)
682
- if typedef_decl.identifier
683
- case name = typedef_decl.identifier.value
684
- when /\A__/, /\A_[A-Z]/, /\A_/
685
- W(:W0809, typedef_decl.location, name)
686
- end
687
- end
688
- end
689
-
690
- def check_tag_name(type_decl)
691
- if type_decl.identifier
692
- case name = type_decl.identifier.value
693
- when /\A__adlint/
694
- # NOTE: To ignore AdLint internal tag names.
695
- when /\A__/, /\A_[A-Z]/, /\A_/
696
- W(:W0809, type_decl.location, name)
697
- end
698
- end
699
- end
700
-
701
- def check_enumerator_name(enumerator)
702
- if enumerator.identifier
703
- case name = enumerator.identifier.value
704
- when /\A__/, /\A_[A-Z]/, /\A_/
705
- W(:W0809, enumerator.location, name)
706
- end
707
- end
708
- end
709
-
710
- def enter_function(node)
711
- check_object_name(node)
712
- @function_def_level += 1
713
- end
714
-
715
- def leave_function(node)
716
- @function_def_level -= 1
717
- end
718
-
719
- def check_object_name(decl_or_def)
720
- if decl_or_def.identifier
721
- case name = decl_or_def.identifier.value
722
- when /\A__/, /\A_[A-Z]/
723
- W(:W0809, decl_or_def.location, name)
724
- when /\A_/
725
- check_filelocal_object_name(name, decl_or_def)
726
- end
727
- end
728
- end
729
-
730
- def check_filelocal_object_name(name, decl_or_def)
731
- if @function_def_level == 0
732
- if scs = decl_or_def.storage_class_specifier and scs.type == :STATIC
733
- W(:W0809, decl_or_def.location, name)
734
- end
735
- end
736
- end
737
- end
738
-
739
- class W1030 < PassiveCodeCheck
740
- def_registrant_phase C::Prepare2Phase
741
-
742
- # NOTE: All messages of cc1-phase code check should be unique till function
743
- # step-in analysis is supported.
744
- ensure_uniqueness_of :W1030
745
-
746
- def initialize(context)
747
- super
748
- visitor = context[:c_visitor]
749
- visitor.enter_generic_labeled_statement += method(:check)
750
- visitor.enter_ansi_function_definition += method(:enter_function)
751
- visitor.leave_ansi_function_definition += method(:leave_function)
752
- visitor.enter_kandr_function_definition += method(:enter_function)
753
- visitor.leave_kandr_function_definition += method(:leave_function)
754
- @labels = nil
755
- end
756
-
757
- private
758
- def check(generic_labeled_statement)
759
- return unless @labels
760
-
761
- label = generic_labeled_statement.label
762
- if @labels.include?(label.value)
763
- W(:W1030, label.location, label.value)
764
- else
765
- @labels.add(label.value)
766
- end
767
- end
768
-
769
- def enter_function(node)
770
- @labels = Set.new
771
- end
772
-
773
- def leave_function(node)
774
- @labels = nil
775
- end
776
- end
777
-
778
- class W1033 < PassiveCodeCheck
779
- def_registrant_phase C::Prepare2Phase
780
-
781
- # NOTE: All messages of cc1-phase code check should be unique till function
782
- # step-in analysis is supported.
783
- ensure_uniqueness_of :W1033
784
-
785
- def initialize(context)
786
- super
787
- visitor = context[:c_visitor]
788
- visitor.enter_ansi_function_definition += method(:check)
789
- visitor.enter_kandr_function_definition += method(:check)
790
- visitor.enter_function_declaration += method(:check)
791
- end
792
-
793
- private
794
- def check(definition_or_declaration)
795
- if return_type = definition_or_declaration.type.return_type
796
- if return_type.const? || return_type.volatile?
797
- W(:W1033, definition_or_declaration.location)
798
- end
799
- end
800
- end
801
- end
802
-
803
- class W1066 < PassiveCodeCheck
804
- def_registrant_phase C::Prepare2Phase
805
-
806
- # NOTE: All messages of cc1-phase code check should be unique till function
807
- # step-in analysis is supported.
808
- ensure_uniqueness_of :W1066
809
-
810
- def initialize(context)
811
- super
812
- @interp = context[:c_interpreter]
813
- @interp.on_explicit_conv_performed += method(:check)
814
- @interp.on_function_started += method(:clear_rvalues)
815
- @interp.on_additive_expr_evaled += method(:handle_additive)
816
- @interp.on_multiplicative_expr_evaled += method(:handle_multiplicative)
817
- @rvalues = nil
818
- end
819
-
820
- private
821
- def check(*, orig_var, result_var)
822
- if @rvalues && orig_var.type.floating?
823
- case expr = @rvalues[orig_var]
824
- when C::AdditiveExpression, C::MultiplicativeExpression
825
- if orig_var.type.same_as?(from_type) &&
826
- result_var.type.same_as?(to_type)
827
- W(message_id, expr.location)
828
- end
829
- end
830
- end
831
- end
832
-
833
- def clear_rvalues(*)
834
- @rvalues = {}
835
- end
836
-
837
- def handle_additive(expr, lhs_var, rhs_var, result_var)
838
- memorize_rvalue_derivation(result_var, expr)
839
- end
840
-
841
- def handle_multiplicative(expr, lhs_var, rhs_var, result_var)
842
- unless expr.operator.type == "%"
843
- memorize_rvalue_derivation(result_var, expr)
844
- end
845
- end
846
-
847
- def memorize_rvalue_derivation(rvalue_holder, expr)
848
- @rvalues[rvalue_holder] = expr if @rvalues
849
- end
850
-
851
- def from_type
852
- @interp.float_type
853
- end
854
-
855
- def to_type
856
- @interp.double_type
857
- end
858
-
859
- def message_id
860
- self.class.name.sub(/\A.*::/, "").intern
861
- end
862
- end
863
-
864
- class W1067 < W1066
865
- def_registrant_phase C::Prepare2Phase
866
-
867
- # NOTE: All messages of cc1-phase code check should be unique till function
868
- # step-in analysis is supported.
869
- ensure_uniqueness_of :W1067
870
-
871
- private
872
- def from_type
873
- @interp.float_type
874
- end
875
-
876
- def to_type
877
- @interp.long_double_type
878
- end
879
- end
880
-
881
- class W1068 < W1066
882
- def_registrant_phase C::Prepare2Phase
883
-
884
- # NOTE: All messages of cc1-phase code check should be unique till function
885
- # step-in analysis is supported.
886
- ensure_uniqueness_of :W1068
887
-
888
- private
889
- def from_type
890
- @interp.double_type
891
- end
892
-
893
- def to_type
894
- @interp.long_double_type
895
- end
896
- end
897
-
898
- class W1069 < PassiveCodeCheck
899
- def_registrant_phase C::Prepare2Phase
900
-
901
- # NOTE: All messages of cc1-phase code check should be unique till function
902
- # step-in analysis is supported.
903
- ensure_uniqueness_of :W1069
904
-
905
- def initialize(context)
906
- super
907
- visitor = context[:c_visitor]
908
- visitor.enter_ansi_function_definition += method(:enter_function)
909
- visitor.enter_kandr_function_definition += method(:enter_function)
910
- visitor.enter_compound_statement += method(:enter_compound_stmt)
911
- visitor.leave_compound_statement += method(:leave_compound_stmt)
912
- visitor.enter_if_else_statement += method(:enter_if_else_stmt)
913
- visitor.leave_if_else_statement += method(:leave_if_else_stmt)
914
- @if_else_stmt_chain_stack = []
915
- end
916
-
917
- private
918
- def enter_function(*)
919
- @if_else_stmt_chain_stack = []
920
- end
921
-
922
- def enter_compound_stmt(*)
923
- @if_else_stmt_chain_stack.push([])
924
- end
925
-
926
- def leave_compound_stmt(*)
927
- @if_else_stmt_chain_stack.pop
928
- end
929
-
930
- def enter_if_else_stmt(node)
931
- @if_else_stmt_chain_stack.last.push(node)
932
- if node.else_statement.kind_of?(C::IfStatement)
933
- W(:W1069, @if_else_stmt_chain_stack.last.first.location)
934
- end
935
- end
936
-
937
- def leave_if_else_stmt(*)
938
- @if_else_stmt_chain_stack.last.pop
939
- end
940
- end
941
-
942
- class W1070 < W0781
943
- def_registrant_phase C::Prepare2Phase
944
-
945
- # NOTE: All messages of cc1-phase code check should be unique till function
946
- # step-in analysis is supported.
947
- ensure_uniqueness_of :W1070
948
-
949
- private
950
- def check(node)
951
- if exec_path_num = @exec_path_nums.last and exec_path_num == 2
952
- W(:W1070, node.location)
953
- end
954
- @exec_path_nums.pop
955
- end
956
-
957
- def add_exec_path(node)
958
- @exec_path_nums[-1] += 1
959
- end
960
- end
961
-
962
- class W1072 < PassiveCodeCheck
963
- def_registrant_phase C::Prepare2Phase
964
-
965
- # NOTE: All messages of cc1-phase code check should be unique till function
966
- # step-in analysis is supported.
967
- ensure_uniqueness_of :W1072
968
-
969
- def initialize(context)
970
- super
971
- visitor = context[:c_visitor]
972
- visitor.enter_goto_statement += method(:warn_goto)
973
- end
974
-
975
- private
976
- def warn_goto(node)
977
- W(:W1072, node.location)
978
- end
979
- end
980
-
981
- end
982
- end
983
- end