adlint 3.2.0 → 3.2.6

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