adlint 3.2.0 → 3.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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