adlint 2.6.14 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. data/AUTHORS +1 -3
  2. data/ChangeLog +511 -0
  3. data/INSTALL +1 -1
  4. data/MANIFEST +57 -37
  5. data/NEWS +36 -7
  6. data/README +2 -2
  7. data/Rakefile +6 -6
  8. data/TODO +1 -1
  9. data/bin/adlint +25 -16
  10. data/bin/adlint_chk +22 -12
  11. data/bin/adlint_cma +17 -12
  12. data/bin/adlint_sma +22 -12
  13. data/bin/adlintize +98 -17
  14. data/etc/conf.d/fallback/cinit.erb +1 -1
  15. data/etc/conf.d/fallback/traits.erb +37 -37
  16. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +1 -1
  17. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +41 -41
  18. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +1 -1
  19. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +40 -40
  20. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +1 -1
  21. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +40 -40
  22. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +1 -1
  23. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +40 -40
  24. data/etc/conf.d/noarch/GNUmakefile.erb +1 -1
  25. data/etc/conf.d/noarch/adlint_all_bat.erb +1 -1
  26. data/etc/conf.d/noarch/adlint_all_sh.erb +1 -1
  27. data/etc/conf.d/noarch/pinit.erb +1 -1
  28. data/etc/conf.d/x86_64-ubuntu_12.04/cinit-gcc_4.6.3.erb +1 -1
  29. data/etc/conf.d/x86_64-ubuntu_12.04/traits-gcc_4.6.3.erb +42 -42
  30. data/etc/mesg.d/c_builtin/en_US/messages.yml +33 -33
  31. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +5 -5
  32. data/etc/mesg.d/core/en_US/messages.yml +2 -2
  33. data/etc/mesg.d/core/ja_JP/messages.yml +2 -2
  34. data/features/code_check/W0018.feature +197 -0
  35. data/features/code_check/W0019.feature +79 -0
  36. data/features/code_check/W0021.feature +81 -0
  37. data/features/code_check/W0023.feature +203 -0
  38. data/features/code_check/W0024.feature +226 -0
  39. data/features/code_check/W0025.feature +5 -0
  40. data/features/code_check/W0088.feature +2 -2
  41. data/features/code_check/W0109.feature +2 -2
  42. data/features/code_check/W0477.feature +0 -3
  43. data/features/code_check/W0478.feature +0 -1
  44. data/features/code_check/W0582.feature +3 -3
  45. data/features/code_check/W0583.feature +4 -7
  46. data/features/code_check/W0646.feature +0 -1
  47. data/features/code_check/W0695.feature +0 -1
  48. data/features/code_check/W0705.feature +8 -0
  49. data/features/code_check/W0723.feature +0 -1
  50. data/features/code_check/W0745.feature +1 -0
  51. data/features/code_check/W0781.feature +1 -0
  52. data/features/code_check/W1057.feature +141 -0
  53. data/features/code_check/W1058.feature +93 -0
  54. data/features/code_check/W1059.feature +86 -0
  55. data/features/code_check/W1060.feature +77 -0
  56. data/features/code_check/W1061.feature +143 -0
  57. data/features/code_check/W1062.feature +162 -0
  58. data/features/code_check/W1063.feature +123 -0
  59. data/features/code_check/W1064.feature +83 -0
  60. data/features/code_check/W1065.feature +82 -0
  61. data/features/code_check/W9003.feature +2 -0
  62. data/features/step_definitions/code_check_steps.rb +1 -0
  63. data/features/support/env.rb +16 -13
  64. data/lib/adlint.rb +7 -4
  65. data/lib/adlint/analyzer.rb +131 -157
  66. data/lib/adlint/annot.rb +149 -0
  67. data/lib/adlint/cc1.rb +57 -0
  68. data/lib/adlint/{c → cc1}/branch.rb +74 -62
  69. data/lib/adlint/{c → cc1}/builtin.rb +21 -21
  70. data/lib/adlint/{c → cc1}/const.rb +119 -117
  71. data/lib/adlint/{c → cc1}/conv.rb +76 -78
  72. data/lib/adlint/{c → cc1}/ctrlexpr.rb +69 -86
  73. data/lib/adlint/cc1/domain.rb +8103 -0
  74. data/lib/adlint/{c → cc1}/enum.rb +3 -3
  75. data/lib/adlint/{c → cc1}/environ.rb +21 -21
  76. data/lib/adlint/{c → cc1}/expr.rb +232 -218
  77. data/lib/adlint/{c → cc1}/format.rb +305 -342
  78. data/lib/adlint/{c → cc1}/interp.rb +269 -220
  79. data/lib/adlint/cc1/lexer.rb +246 -0
  80. data/lib/adlint/{c → cc1}/mediator.rb +78 -84
  81. data/lib/adlint/{c → cc1}/object.rb +261 -264
  82. data/lib/adlint/{c → cc1}/operator.rb +7 -7
  83. data/lib/adlint/{c → cc1}/option.rb +4 -3
  84. data/lib/adlint/{c → cc1}/parser.rb +274 -506
  85. data/lib/adlint/{c → cc1}/parser.y +69 -301
  86. data/lib/adlint/cc1/phase.rb +138 -0
  87. data/lib/adlint/{c → cc1}/resolver.rb +66 -78
  88. data/lib/adlint/{c → cc1}/scanner.rb +57 -49
  89. data/lib/adlint/{c → cc1}/scope.rb +3 -3
  90. data/lib/adlint/{c → cc1}/seqp.rb +13 -5
  91. data/lib/adlint/{c → cc1}/syntax.rb +819 -1122
  92. data/lib/adlint/{c → cc1}/type.rb +1498 -1479
  93. data/lib/adlint/{c → cc1}/util.rb +20 -12
  94. data/lib/adlint/{c → cc1}/value.rb +699 -642
  95. data/lib/adlint/code.rb +163 -164
  96. data/lib/adlint/cpp.rb +2 -2
  97. data/lib/adlint/cpp/asm.rb +13 -14
  98. data/lib/adlint/cpp/constexpr.rb +42 -38
  99. data/lib/adlint/cpp/constexpr.y +44 -40
  100. data/lib/adlint/cpp/eval.rb +435 -435
  101. data/lib/adlint/cpp/lexer.rb +343 -340
  102. data/lib/adlint/cpp/macro.rb +188 -190
  103. data/lib/adlint/cpp/phase.rb +66 -45
  104. data/lib/adlint/cpp/scanner.rb +14 -17
  105. data/lib/adlint/cpp/source.rb +49 -55
  106. data/lib/adlint/cpp/subst.rb +65 -65
  107. data/lib/adlint/cpp/syntax.rb +155 -275
  108. data/lib/adlint/cpp/util.rb +22 -19
  109. data/lib/adlint/driver.rb +86 -93
  110. data/lib/adlint/error.rb +33 -52
  111. data/lib/adlint/exam.rb +158 -24
  112. data/lib/adlint/exam/c_builtin.rb +7 -7
  113. data/lib/adlint/exam/c_builtin/cc1_check.rb +20522 -0
  114. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +957 -0
  115. data/lib/adlint/exam/c_builtin/cc1_code.rb +459 -0
  116. data/lib/adlint/exam/c_builtin/cc1_metric.rb +794 -0
  117. data/lib/adlint/exam/c_builtin/cpp_check.rb +486 -441
  118. data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +36 -39
  119. data/lib/adlint/exam/c_builtin/cpp_code.rb +63 -65
  120. data/lib/adlint/exam/c_builtin/ld_check.rb +136 -129
  121. data/lib/adlint/exam/c_builtin/ld_metric.rb +11 -11
  122. data/lib/adlint/lang.rb +25 -25
  123. data/lib/adlint/ld.rb +2 -2
  124. data/lib/adlint/ld/object.rb +220 -188
  125. data/lib/adlint/ld/phase.rb +94 -63
  126. data/lib/adlint/ld/typedef.rb +22 -11
  127. data/lib/adlint/ld/util.rb +43 -35
  128. data/lib/adlint/lexer.rb +59 -56
  129. data/lib/adlint/location.rb +140 -0
  130. data/lib/adlint/memo.rb +157 -0
  131. data/lib/adlint/message.rb +207 -156
  132. data/lib/adlint/metric.rb +139 -217
  133. data/lib/adlint/monitor.rb +45 -43
  134. data/lib/adlint/phase.rb +56 -29
  135. data/lib/adlint/prelude.rb +66 -54
  136. data/lib/adlint/report.rb +253 -332
  137. data/lib/adlint/source.rb +26 -27
  138. data/lib/adlint/supp.rb +131 -0
  139. data/lib/adlint/symbol.rb +14 -16
  140. data/lib/adlint/token.rb +19 -91
  141. data/lib/adlint/traits.rb +242 -226
  142. data/lib/adlint/util.rb +116 -205
  143. data/lib/adlint/version.rb +8 -8
  144. data/share/HEADER +2 -2
  145. data/share/doc/developers_guide_ja.html +148 -19
  146. data/share/doc/developers_guide_ja.texi +141 -11
  147. data/share/doc/samples/GNUmakefile +1 -1
  148. data/share/doc/samples/adlint_traits.yml +45 -36
  149. data/share/doc/users_guide_en.html +1321 -1252
  150. data/share/doc/users_guide_en.texi +475 -408
  151. data/share/doc/users_guide_ja.html +1932 -1878
  152. data/share/doc/users_guide_ja.texi +324 -273
  153. data/share/sample/bison-2.5/adlint/GNUmakefile +5 -1
  154. data/share/sample/bison-2.5/adlint/adlint_traits.yml +38 -38
  155. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +1 -1
  156. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +1 -1
  157. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +1 -1
  158. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +50 -42
  159. data/share/sample/bison-2.5/adlint/src/GNUmakefile +1 -1
  160. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +1 -1
  161. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +1 -1
  162. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +50 -42
  163. data/share/sample/ctags-5.8/adlint/GNUmakefile +1 -1
  164. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +1 -1
  165. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +1 -1
  166. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +50 -42
  167. data/share/sample/flex-2.5.35/adlint/GNUmakefile +1 -1
  168. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +1 -1
  169. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +1 -1
  170. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +50 -42
  171. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +1 -1
  172. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +46 -38
  173. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +1 -1
  174. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +1 -1
  175. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +1 -1
  176. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +50 -42
  177. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +1 -1
  178. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +1 -1
  179. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +1 -1
  180. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +50 -42
  181. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +1 -1
  182. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +1 -1
  183. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +1 -1
  184. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +50 -42
  185. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +1 -1
  186. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +1 -1
  187. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +1 -1
  188. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +50 -42
  189. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +1 -1
  190. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +1 -1
  191. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +1 -1
  192. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +50 -42
  193. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +1 -1
  194. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +1 -1
  195. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +1 -1
  196. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +50 -42
  197. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +1 -1
  198. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +1 -1
  199. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +1 -1
  200. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +50 -42
  201. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +1 -1
  202. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +1 -1
  203. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +1 -1
  204. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +50 -42
  205. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +1 -1
  206. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +1 -1
  207. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +1 -1
  208. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +50 -42
  209. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +1 -1
  210. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +1 -1
  211. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +1 -1
  212. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +50 -42
  213. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +1 -1
  214. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +1 -1
  215. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +1 -1
  216. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +50 -42
  217. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +1 -1
  218. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +1 -1
  219. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +1 -1
  220. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +50 -42
  221. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +1 -1
  222. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +1 -1
  223. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +1 -1
  224. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +50 -42
  225. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +1 -1
  226. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +1 -1
  227. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +1 -1
  228. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +50 -42
  229. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +1 -1
  230. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +1 -1
  231. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +1 -1
  232. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +50 -42
  233. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +1 -1
  234. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +1 -1
  235. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +1 -1
  236. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +50 -42
  237. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +1 -1
  238. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +1 -1
  239. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +1 -1
  240. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +50 -42
  241. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +1 -1
  242. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +1 -1
  243. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +1 -1
  244. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +50 -42
  245. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +1 -1
  246. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +1 -1
  247. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +1 -1
  248. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +50 -42
  249. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +1 -1
  250. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +1 -1
  251. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +1 -1
  252. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +50 -42
  253. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +1 -1
  254. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +1 -1
  255. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +1 -1
  256. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +50 -42
  257. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +1 -1
  258. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +1 -1
  259. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +1 -1
  260. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +50 -42
  261. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +1 -1
  262. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +1 -1
  263. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +1 -1
  264. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +50 -42
  265. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +1 -1
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +1 -1
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +1 -1
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +50 -42
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +1 -1
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +1 -1
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +1 -1
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +50 -42
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +1 -1
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +1 -1
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +1 -1
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +50 -42
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +1 -1
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +1 -1
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +1 -1
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +50 -42
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +1 -1
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +1 -1
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +1 -1
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +50 -42
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +1 -1
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +1 -1
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +1 -1
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +50 -42
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +1 -1
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +1 -1
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +1 -1
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +50 -42
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +1 -1
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +1 -1
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +1 -1
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +50 -42
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +1 -1
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +1 -1
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +1 -1
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +50 -42
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +1 -1
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +1 -1
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +1 -1
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +50 -42
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +1 -1
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +1 -1
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +1 -1
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +50 -42
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +1 -1
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +1 -1
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +1 -1
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +50 -42
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +1 -1
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +1 -1
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +1 -1
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +50 -42
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +1 -1
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +1 -1
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +1 -1
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +50 -42
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +1 -1
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +1 -1
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +1 -1
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +50 -42
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +1 -1
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +1 -1
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +1 -1
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +50 -42
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +1 -1
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +1 -1
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +1 -1
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +50 -42
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +1 -1
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +1 -1
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +1 -1
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +50 -42
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +1 -1
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +1 -1
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +1 -1
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +50 -42
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +1 -1
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +1 -1
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +1 -1
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +50 -42
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +1 -1
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +1 -1
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +1 -1
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +50 -42
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +1 -1
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +1 -1
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +1 -1
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +50 -42
  353. data/share/sample/screen-4.0.3/adlint/GNUmakefile +1 -1
  354. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +1 -1
  355. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +1 -1
  356. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +50 -42
  357. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +1 -1
  358. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +1 -1
  359. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +1 -1
  360. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +50 -42
  361. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +1 -1
  362. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +1 -1
  363. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +1 -1
  364. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +49 -41
  365. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +1 -1
  366. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +46 -38
  367. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +1 -1
  368. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +1 -1
  369. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +1 -1
  370. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +50 -42
  371. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +1 -1
  372. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +1 -1
  373. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +1 -1
  374. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +50 -42
  375. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +1 -1
  376. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +1 -1
  377. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +1 -1
  378. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +50 -42
  379. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +1 -1
  380. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +1 -1
  381. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +1 -1
  382. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +50 -42
  383. data/spec/adlint/{c → cc1}/ctrlexpr_spec.rb +51 -49
  384. data/spec/adlint/{c → cc1}/domain_spec.rb +210 -179
  385. data/spec/adlint/{c → cc1}/operator_spec.rb +3 -3
  386. data/spec/adlint/{c → cc1}/syntax_spec.rb +10 -12
  387. data/spec/adlint/{c → cc1}/type_spec.rb +61 -68
  388. data/{lib/adlint/c.rb → spec/adlint/location_spec.rb} +24 -29
  389. data/spec/conf.d/default_traits.yml +38 -37
  390. data/spec/conf.d/empty_cinit.h +1 -1
  391. data/spec/conf.d/empty_pinit.h +1 -1
  392. data/spec/conf.d/project/foo.c +0 -0
  393. data/spec/spec_helper.rb +2 -2
  394. metadata +60 -40
  395. data/lib/adlint/c/domain.rb +0 -7931
  396. data/lib/adlint/c/lexer.rb +0 -252
  397. data/lib/adlint/c/phase.rb +0 -135
  398. data/lib/adlint/exam/c_builtin/c_check.rb +0 -20745
  399. data/lib/adlint/exam/c_builtin/c_check_shima.rb +0 -983
  400. data/lib/adlint/exam/c_builtin/c_code.rb +0 -477
  401. data/lib/adlint/exam/c_builtin/c_metric.rb +0 -818
@@ -1,818 +0,0 @@
1
- # Metric measurements (cc1-phase) of adlint-exam-c_builtin package.
2
- #
3
- # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
- # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
5
- # License:: GPLv3+: GNU General Public License version 3 or later
6
- #
7
- # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
8
-
9
- #--
10
- # ___ ____ __ ___ _________
11
- # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
- # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
- # / __ |/ /_/ / /___/ / /| / / /
14
- # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
15
- #
16
- # This file is part of AdLint.
17
- #
18
- # AdLint is free software: you can redistribute it and/or modify it under the
19
- # terms of the GNU General Public License as published by the Free Software
20
- # Foundation, either version 3 of the License, or (at your option) any later
21
- # version.
22
- #
23
- # AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
24
- # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
25
- # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26
- #
27
- # You should have received a copy of the GNU General Public License along with
28
- # AdLint. If not, see <http://www.gnu.org/licenses/>.
29
- #
30
- #++
31
-
32
- require "adlint/exam"
33
- require "adlint/report"
34
- require "adlint/c/phase"
35
- require "adlint/c/syntax"
36
-
37
- module AdLint #:nodoc:
38
- module Exam #:nodoc:
39
- module CBuiltin #:nodoc:
40
-
41
- class FL_STMT < MetricMeasurement
42
- def_registrant_phase C::Prepare2Phase
43
-
44
- def initialize(context)
45
- super
46
- @fpath = context[:sources].first.fpath
47
- visitor = context[:c_visitor]
48
- visitor.enter_error_statement += method(:count_statement)
49
- visitor.enter_generic_labeled_statement += method(:count_statement)
50
- visitor.enter_case_labeled_statement += method(:count_statement)
51
- visitor.enter_default_labeled_statement += method(:count_statement)
52
- visitor.enter_expression_statement += method(:count_statement)
53
- visitor.enter_if_statement += method(:count_statement)
54
- visitor.enter_if_else_statement += method(:count_statement)
55
- visitor.enter_switch_statement += method(:count_statement)
56
- visitor.enter_while_statement += method(:count_statement)
57
- visitor.enter_do_statement += method(:count_statement)
58
- visitor.enter_for_statement += method(:count_statement)
59
- visitor.enter_c99_for_statement += method(:count_statement)
60
- visitor.enter_goto_statement += method(:count_statement)
61
- visitor.enter_continue_statement += method(:count_statement)
62
- visitor.enter_break_statement += method(:count_statement)
63
- visitor.enter_return_statement += method(:count_statement)
64
- visitor.leave_translation_unit += method(:measure)
65
- @statement_count = 0
66
- end
67
-
68
- private
69
- def do_prepare(context) end
70
- def do_execute(context) end
71
-
72
- def count_statement(statement)
73
- if @fpath == statement.location.fpath
74
- @statement_count += 1
75
- end
76
- end
77
-
78
- def measure(node)
79
- FL_STMT(@fpath, @statement_count)
80
- end
81
- end
82
-
83
- class FL_FUNC < MetricMeasurement
84
- def_registrant_phase C::Prepare2Phase
85
-
86
- def initialize(context)
87
- super
88
- @fpath = context[:sources].first.fpath
89
- visitor = context[:c_visitor]
90
- visitor.enter_ansi_function_definition += method(:count_function)
91
- visitor.enter_kandr_function_definition += method(:count_function)
92
- visitor.leave_translation_unit += method(:measure)
93
- @function_count = 0
94
- end
95
-
96
- private
97
- def do_prepare(context) end
98
- def do_execute(context) end
99
-
100
- def count_function(function_definition)
101
- if @fpath == function_definition.location.fpath
102
- @function_count += 1
103
- end
104
- end
105
-
106
- def measure(node)
107
- FL_FUNC(@fpath, @function_count)
108
- end
109
- end
110
-
111
- class FN_STMT < MetricMeasurement
112
- def_registrant_phase C::Prepare2Phase
113
-
114
- def initialize(context)
115
- super
116
- @fpath = context[:sources].first.fpath
117
- visitor = context[:c_visitor]
118
- visitor.enter_ansi_function_definition += method(:enter_function)
119
- visitor.leave_ansi_function_definition += method(:leave_function)
120
- visitor.enter_kandr_function_definition += method(:enter_function)
121
- visitor.leave_kandr_function_definition += method(:leave_function)
122
- visitor.enter_error_statement += method(:count_statement)
123
- visitor.enter_generic_labeled_statement += method(:count_statement)
124
- visitor.enter_case_labeled_statement += method(:count_statement)
125
- visitor.enter_default_labeled_statement += method(:count_statement)
126
- visitor.enter_expression_statement += method(:count_statement)
127
- visitor.enter_if_statement += method(:count_statement)
128
- visitor.enter_if_else_statement += method(:count_statement)
129
- visitor.enter_switch_statement += method(:count_statement)
130
- visitor.enter_while_statement += method(:count_statement)
131
- visitor.enter_do_statement += method(:count_statement)
132
- visitor.enter_for_statement += method(:count_statement)
133
- visitor.enter_c99_for_statement += method(:count_statement)
134
- visitor.enter_goto_statement += method(:count_statement)
135
- visitor.enter_continue_statement += method(:count_statement)
136
- visitor.enter_break_statement += method(:count_statement)
137
- visitor.enter_return_statement += method(:count_statement)
138
- @current_function = nil
139
- @statement_count = 0
140
- end
141
-
142
- private
143
- def do_prepare(context) end
144
- def do_execute(context) end
145
-
146
- def enter_function(function_definition)
147
- if @fpath == function_definition.location.fpath
148
- @current_function = function_definition
149
- @statement_count = 0
150
- end
151
- end
152
-
153
- def leave_function(function_definition)
154
- return unless @current_function
155
-
156
- FN_STMT(FunctionIdentifier.new(@current_function.identifier.value,
157
- @current_function.signature.to_s),
158
- @current_function.location, @statement_count)
159
-
160
- @current_function = nil
161
- @statement_count = 0
162
- end
163
-
164
- def count_statement(statement)
165
- if @current_function
166
- @statement_count += 1
167
- end
168
- end
169
- end
170
-
171
- class FN_UNRC < MetricMeasurement
172
- def_registrant_phase C::Prepare2Phase
173
-
174
- def initialize(context)
175
- super
176
- @fpath = context[:sources].first.fpath
177
- visitor = context[:c_visitor]
178
- visitor.enter_ansi_function_definition += method(:enter_function)
179
- visitor.leave_ansi_function_definition += method(:leave_function)
180
- visitor.enter_kandr_function_definition += method(:enter_function)
181
- visitor.leave_kandr_function_definition += method(:leave_function)
182
- visitor.enter_error_statement += method(:count_statement)
183
- visitor.enter_generic_labeled_statement += method(:count_statement)
184
- visitor.enter_case_labeled_statement += method(:count_statement)
185
- visitor.enter_default_labeled_statement += method(:count_statement)
186
- visitor.enter_expression_statement += method(:count_statement)
187
- visitor.enter_if_statement += method(:count_statement)
188
- visitor.enter_if_else_statement += method(:count_statement)
189
- visitor.enter_switch_statement += method(:count_statement)
190
- visitor.enter_while_statement += method(:count_statement)
191
- visitor.enter_do_statement += method(:count_statement)
192
- visitor.enter_for_statement += method(:count_statement)
193
- visitor.enter_c99_for_statement += method(:count_statement)
194
- visitor.enter_goto_statement += method(:count_statement)
195
- visitor.enter_continue_statement += method(:count_statement)
196
- visitor.enter_break_statement += method(:count_statement)
197
- visitor.enter_return_statement += method(:count_statement)
198
- @current_function = nil
199
- @unreached_statement_count = 0
200
- end
201
-
202
- private
203
- def do_prepare(context) end
204
- def do_execute(context) end
205
-
206
- def enter_function(function_definition)
207
- if @fpath == function_definition.location.fpath
208
- @current_function = function_definition
209
- @unreached_statement_count = 0
210
- end
211
- end
212
-
213
- def leave_function(function_definition)
214
- return unless @current_function
215
-
216
- FN_UNRC(FunctionIdentifier.new(@current_function.identifier.value,
217
- @current_function.signature.to_s),
218
- @current_function.location, @unreached_statement_count)
219
-
220
- @current_function = nil
221
- @unreached_statement_count = 0
222
- end
223
-
224
- def count_statement(statement)
225
- return unless @current_function
226
-
227
- unless statement.executed?
228
- @unreached_statement_count += 1
229
- end
230
- end
231
- end
232
-
233
- class FN_LINE < MetricMeasurement
234
- def_registrant_phase C::Prepare2Phase
235
-
236
- def initialize(context)
237
- super
238
- @fpath = context[:sources].first.fpath
239
- visitor = context[:c_visitor]
240
- visitor.enter_ansi_function_definition += method(:measure)
241
- visitor.enter_kandr_function_definition += method(:measure)
242
- end
243
-
244
- private
245
- def do_prepare(context) end
246
- def do_execute(context) end
247
-
248
- def measure(function_definition)
249
- if @fpath == function_definition.location.fpath
250
- FN_LINE(FunctionIdentifier.new(function_definition.identifier.value,
251
- function_definition.signature.to_s),
252
- function_definition.location, function_definition.lines)
253
- end
254
- end
255
- end
256
-
257
- class FN_PARA < MetricMeasurement
258
- def_registrant_phase C::Prepare2Phase
259
-
260
- def initialize(context)
261
- super
262
- @fpath = context[:sources].first.fpath
263
- visitor = context[:c_visitor]
264
- visitor.enter_ansi_function_definition += method(:measure_ansi_func)
265
- visitor.enter_kandr_function_definition += method(:measure_kandr_func)
266
- end
267
-
268
- private
269
- def do_prepare(context) end
270
- def do_execute(context) end
271
-
272
- def measure_ansi_func(function_definition)
273
- if @fpath == function_definition.location.fpath
274
- # TODO: Determine how many parameters if function has va_list.
275
- if function_definition.parameter_type_list
276
- parameters = function_definition.parameter_definitions
277
- FN_PARA(FunctionIdentifier.new(function_definition.identifier.value,
278
- function_definition.signature.to_s),
279
- function_definition.location,
280
- parameters.count { |param| !param.type.void? })
281
- else
282
- # TODO: Determine how many parameters if signature is abbreviated.
283
- FN_PARA(FunctionIdentifier.new(function_definition.identifier.value,
284
- function_definition.signature.to_s),
285
- function_definition.location, 0)
286
- end
287
- end
288
- end
289
-
290
- def measure_kandr_func(function_definition)
291
- if @fpath == function_definition.location.fpath
292
- FN_PARA(FunctionIdentifier.new(function_definition.identifier.value,
293
- function_definition.signature.to_s),
294
- function_definition.location,
295
- function_definition.identifier_list.size)
296
- end
297
- end
298
- end
299
-
300
- class FN_UNUV < MetricMeasurement
301
- def_registrant_phase C::Prepare2Phase
302
-
303
- def initialize(context)
304
- super
305
- @fpath = context[:sources].first.fpath
306
- interp = context[:c_interpreter]
307
- interp.on_function_started += method(:enter_function)
308
- interp.on_function_ended += method(:leave_function)
309
- interp.on_variable_defined += method(:define_variable)
310
- interp.on_parameter_defined += method(:define_variable)
311
- interp.on_variable_referred += method(:refer_variable)
312
- interp.on_variable_value_referred += method(:read_variable)
313
- interp.on_variable_value_updated += method(:write_variable)
314
- @current_function = nil
315
- @variables = nil
316
- end
317
-
318
- private
319
- def do_prepare(context) end
320
- def do_execute(context) end
321
-
322
- def enter_function(function_definition, function)
323
- if @fpath == function_definition.location.fpath
324
- @current_function = function_definition
325
- @variables = {}
326
- end
327
- end
328
-
329
- def leave_function(function_definition, function)
330
- return unless @current_function
331
-
332
- useless_count = @variables.each_value.reduce(0) { |count, read_count|
333
- read_count == 0 ? count + 1 : count
334
- }
335
-
336
- FN_UNUV(FunctionIdentifier.new(@current_function.identifier.value,
337
- @current_function.signature.to_s),
338
- @current_function.location, useless_count)
339
-
340
- @current_function = nil
341
- @variables = nil
342
- end
343
-
344
- def define_variable(definition, variable)
345
- if @current_function
346
- @variables[variable.name] = 0
347
- end
348
- end
349
-
350
- def refer_variable(expression, variable)
351
- return unless @current_function
352
-
353
- if variable.named? && @variables[variable.name]
354
- @variables[variable.name] += 1
355
- end
356
- end
357
-
358
- def read_variable(expression, variable)
359
- return unless @current_function
360
-
361
- if variable.named? && @variables[variable.name]
362
- @variables[variable.name] += 1
363
- end
364
- end
365
-
366
- def write_variable(expression, variable)
367
- return unless @current_function
368
-
369
- if variable.named? && @variables[variable.name]
370
- @variables[variable.name] = 0
371
- end
372
- end
373
- end
374
-
375
- class FN_CSUB < MetricMeasurement
376
- def_registrant_phase C::Prepare2Phase
377
-
378
- def initialize(context)
379
- super
380
- @fpath = context[:sources].first.fpath
381
- visitor = context[:c_visitor]
382
- visitor.enter_ansi_function_definition += method(:enter_function)
383
- visitor.leave_ansi_function_definition += method(:leave_function)
384
- visitor.enter_kandr_function_definition += method(:enter_function)
385
- visitor.leave_kandr_function_definition += method(:leave_function)
386
- visitor.enter_function_call_expression += method(:count_function_call)
387
- @current_function = nil
388
- @function_call_count = 0
389
- end
390
-
391
- private
392
- def do_prepare(context) end
393
- def do_execute(context) end
394
-
395
- def enter_function(function_definition)
396
- if @fpath == function_definition.location.fpath
397
- @current_function = function_definition
398
- @function_call_count = 0
399
- end
400
- end
401
-
402
- def leave_function(function_definition)
403
- return unless @current_function
404
-
405
- FN_CSUB(FunctionIdentifier.new(@current_function.identifier.value,
406
- @current_function.signature.to_s),
407
- @current_function.location, @function_call_count)
408
-
409
- @current_function = nil
410
- @function_call_count = 0
411
- end
412
-
413
- def count_function_call(node)
414
- if @current_function
415
- @function_call_count += 1
416
- end
417
- end
418
- end
419
-
420
- class FN_GOTO < MetricMeasurement
421
- def_registrant_phase C::Prepare2Phase
422
-
423
- def initialize(context)
424
- super
425
- @fpath = context[:sources].first.fpath
426
- visitor = context[:c_visitor]
427
- visitor.enter_ansi_function_definition += method(:enter_function)
428
- visitor.leave_ansi_function_definition += method(:leave_function)
429
- visitor.enter_kandr_function_definition += method(:enter_function)
430
- visitor.leave_kandr_function_definition += method(:leave_function)
431
- visitor.enter_goto_statement += method(:count_goto)
432
- @current_function = nil
433
- @goto_count = 0
434
- end
435
-
436
- private
437
- def do_prepare(context) end
438
- def do_execute(context) end
439
-
440
- def enter_function(function_definition)
441
- if @fpath == function_definition.location.fpath
442
- @current_function = function_definition
443
- @goto_count = 0
444
- end
445
- end
446
-
447
- def leave_function(function_definition)
448
- return unless @current_function
449
-
450
- FN_GOTO(FunctionIdentifier.new(@current_function.identifier.value,
451
- @current_function.signature.to_s),
452
- @current_function.location, @goto_count)
453
-
454
- @current_function = nil
455
- @goto_count = 0
456
- end
457
-
458
- def count_goto(node)
459
- if @current_function
460
- @goto_count += 1
461
- end
462
- end
463
- end
464
-
465
- class FN_RETN < MetricMeasurement
466
- def_registrant_phase C::Prepare2Phase
467
-
468
- def initialize(context)
469
- super
470
- @fpath = context[:sources].first.fpath
471
- visitor = context[:c_visitor]
472
- visitor.enter_ansi_function_definition += method(:enter_function)
473
- visitor.leave_ansi_function_definition += method(:leave_function)
474
- visitor.enter_kandr_function_definition += method(:enter_function)
475
- visitor.leave_kandr_function_definition += method(:leave_function)
476
- visitor.enter_error_statement += method(:enter_statement)
477
- visitor.enter_generic_labeled_statement += method(:enter_statement)
478
- visitor.enter_case_labeled_statement += method(:enter_statement)
479
- visitor.enter_default_labeled_statement += method(:enter_statement)
480
- visitor.enter_expression_statement += method(:enter_statement)
481
- visitor.enter_if_statement += method(:enter_statement)
482
- visitor.enter_if_else_statement += method(:enter_statement)
483
- visitor.enter_switch_statement += method(:enter_statement)
484
- visitor.enter_while_statement += method(:enter_statement)
485
- visitor.enter_do_statement += method(:enter_statement)
486
- visitor.enter_for_statement += method(:enter_statement)
487
- visitor.enter_c99_for_statement += method(:enter_statement)
488
- visitor.enter_goto_statement += method(:enter_statement)
489
- visitor.enter_continue_statement += method(:enter_statement)
490
- visitor.enter_break_statement += method(:enter_statement)
491
- visitor.enter_return_statement += method(:count_return)
492
- @current_function = nil
493
- @return_count = 0
494
- @last_statement = nil
495
- end
496
-
497
- private
498
- def do_prepare(context) end
499
- def do_execute(context) end
500
-
501
- def enter_function(function_definition)
502
- if @fpath == function_definition.location.fpath
503
- @current_function = function_definition
504
- @return_count = 0
505
- @last_statement = nil
506
- end
507
- end
508
-
509
- def leave_function(function_definition)
510
- return unless @current_function
511
-
512
- if @current_function.type.return_type.void? &&
513
- !(@last_statement.kind_of?(C::ReturnStatement))
514
- FN_RETN(FunctionIdentifier.new(@current_function.identifier.value,
515
- @current_function.signature.to_s),
516
- @current_function.location, @return_count + 1)
517
- else
518
- FN_RETN(FunctionIdentifier.new(@current_function.identifier.value,
519
- @current_function.signature.to_s),
520
- @current_function.location, @return_count)
521
- end
522
-
523
- @current_function = nil
524
- @return_count = 0
525
- @last_statement = nil
526
- end
527
-
528
- def enter_statement(node)
529
- return unless @current_function
530
-
531
- if node.executed?
532
- @last_statement = node
533
- end
534
- end
535
-
536
- def count_return(node)
537
- if @current_function
538
- @return_count += 1
539
- @last_statement = node
540
- end
541
- end
542
- end
543
-
544
- class FN_UELS < MetricMeasurement
545
- def_registrant_phase C::Prepare2Phase
546
-
547
- def initialize(context)
548
- super
549
- @fpath = context[:sources].first.fpath
550
- visitor = context[:c_visitor]
551
- visitor.enter_ansi_function_definition += method(:enter_function)
552
- visitor.leave_ansi_function_definition += method(:leave_function)
553
- visitor.enter_kandr_function_definition += method(:enter_function)
554
- visitor.leave_kandr_function_definition += method(:leave_function)
555
- visitor.enter_if_else_statement += method(:enter_if_else_statement)
556
- visitor.leave_if_else_statement += method(:leave_if_else_statement)
557
- @current_function = nil
558
- @if_else_statement_chain = 0
559
- @incomplete_if_else_statement_count = 0
560
- end
561
-
562
- private
563
- def do_prepare(context) end
564
- def do_execute(context) end
565
-
566
- def enter_function(function_definition)
567
- if @fpath == function_definition.location.fpath
568
- @current_function = function_definition
569
- @if_else_statement_chain = 0
570
- @incomplete_if_else_statement_count = 0
571
- end
572
- end
573
-
574
- def leave_function(function_definition)
575
- return unless @current_function
576
-
577
- FN_UELS(FunctionIdentifier.new(@current_function.identifier.value,
578
- @current_function.signature.to_s),
579
- @current_function.location, @incomplete_if_else_statement_count)
580
-
581
- @current_function = nil
582
- @if_else_statement_chain = 0
583
- @incomplete_if_else_statement_count = 0
584
- end
585
-
586
- def enter_if_else_statement(node)
587
- @if_else_statement_chain += 1
588
-
589
- if @current_function && @if_else_statement_chain > 0
590
- if node.else_statement.kind_of?(C::IfStatement)
591
- @incomplete_if_else_statement_count += 1
592
- end
593
- end
594
- end
595
-
596
- def leave_if_else_statement(node)
597
- @if_else_statement_chain -= 1
598
- end
599
- end
600
-
601
- class FN_NEST < MetricMeasurement
602
- def_registrant_phase C::Prepare2Phase
603
-
604
- def initialize(context)
605
- super
606
- @fpath = context[:sources].first.fpath
607
- visitor = context[:c_visitor]
608
- visitor.enter_ansi_function_definition += method(:enter_function)
609
- visitor.leave_ansi_function_definition += method(:leave_function)
610
- visitor.enter_kandr_function_definition += method(:enter_function)
611
- visitor.leave_kandr_function_definition += method(:leave_function)
612
- visitor.enter_compound_statement += method(:enter_block)
613
- visitor.leave_compound_statement += method(:leave_block)
614
- visitor.enter_if_statement += method(:check_statement)
615
- visitor.enter_if_else_statement += method(:check_statement)
616
- visitor.enter_while_statement += method(:check_statement)
617
- visitor.enter_do_statement += method(:check_statement)
618
- visitor.enter_for_statement += method(:check_statement)
619
- visitor.enter_c99_for_statement += method(:check_statement)
620
- @current_function = nil
621
- end
622
-
623
- private
624
- def do_prepare(context) end
625
- def do_execute(context) end
626
-
627
- def enter_function(function_definition)
628
- if @fpath == function_definition.location.fpath
629
- @current_function = function_definition
630
- # NOTE: Nest level of the top of the function is 0.
631
- # Function definition must have a compound-statement as the
632
- # function body.
633
- @max_nest_level = @current_nest_level = -1
634
- end
635
- end
636
-
637
- def leave_function(function_definition)
638
- return unless @current_function
639
-
640
- FN_NEST(FunctionIdentifier.new(@current_function.identifier.value,
641
- @current_function.signature.to_s),
642
- @current_function.location, @max_nest_level)
643
-
644
- @current_function = nil
645
- end
646
-
647
- def enter_block(compound_statement)
648
- if @current_function
649
- @current_nest_level += 1
650
- @max_nest_level = [@max_nest_level, @current_nest_level].max
651
- end
652
- end
653
-
654
- def leave_block(compound_statement)
655
- if @current_function
656
- @current_nest_level -= 1
657
- end
658
- end
659
-
660
- def check_statement(statement)
661
- return unless @current_function
662
-
663
- case statement
664
- when C::IfStatement
665
- sub_statement = statement.statement
666
- when C::IfElseStatement
667
- if statement.then_statement.kind_of?(C::CompoundStatement)
668
- sub_statement = statement.else_statement
669
- else
670
- sub_statement = statement.then_statement
671
- end
672
- when C::WhileStatement, C::DoStatement
673
- sub_statement = statement.statement
674
- when C::ForStatement, C::C99ForStatement
675
- sub_statement = statement.body_statement
676
- end
677
-
678
- case sub_statement
679
- when C::CompoundStatement, C::IfStatement, C::IfElseStatement
680
- else
681
- @current_nest_level += 1
682
- @max_nest_level = [@max_nest_level, @current_nest_level].max
683
- end
684
- end
685
- end
686
-
687
- class FN_PATH < MetricMeasurement
688
- def_registrant_phase C::Prepare2Phase
689
-
690
- def initialize(context)
691
- super
692
- @fpath = context[:sources].first.fpath
693
- interp = context[:c_interpreter]
694
- interp.on_function_started += method(:enter_function)
695
- interp.on_function_ended += method(:leave_function)
696
- interp.on_branch_started += method(:enter_branch)
697
- interp.on_branch_ended += method(:leave_branch)
698
- @current_function = nil
699
- end
700
-
701
- private
702
- def do_prepare(context) end
703
- def do_execute(context) end
704
-
705
- def enter_function(function_definition, function)
706
- if @fpath == function_definition.location.fpath
707
- @current_function = function_definition
708
-
709
- # NOTE: Number of paths in the current function.
710
- @paths_in_function = 1
711
- # NOTE: Stack of the number of paths to enter the current branch group.
712
- @paths_to_enter_branch_group = [@paths_in_function]
713
- # NOTE: Stack of the number of paths in the current branch.
714
- @paths_in_branch = [@paths_in_function]
715
- # NOTE: Stack of the number of paths in the current branch group.
716
- @paths_in_branch_group = [@paths_in_function]
717
- end
718
- end
719
-
720
- def leave_function(function_definition, function)
721
- return unless @current_function
722
-
723
- FN_PATH(FunctionIdentifier.new(@current_function.identifier.value,
724
- @current_function.signature.to_s),
725
- @current_function.location, @paths_in_function)
726
-
727
- @current_function = nil
728
- end
729
-
730
- def enter_branch(branch)
731
- return unless @current_function
732
-
733
- # NOTE: Entering into new branch group.
734
- if branch.first?
735
- @paths_in_function -= @paths_in_branch.last
736
- @paths_to_enter_branch_group.push(@paths_in_branch.last)
737
- @paths_in_branch_group.push(0)
738
- end
739
-
740
- # NOTE: Entering into new branch.
741
- @paths_in_branch.push(@paths_to_enter_branch_group.last)
742
- @paths_in_function += @paths_to_enter_branch_group.last
743
- end
744
-
745
- def leave_branch(branch)
746
- return unless @current_function
747
-
748
- paths_in_this_branch = @paths_in_branch.pop
749
-
750
- # NOTE: Leaving from the current branch whose paths are not terminated.
751
- unless branch.break_with_return?
752
- @paths_in_branch_group[-1] += paths_in_this_branch
753
- end
754
-
755
- # NOTE: Leaving from the current branch group.
756
- if branch.final?
757
- paths_to_enter_this_branch_group = @paths_to_enter_branch_group.pop
758
- paths_in_this_branch_group = @paths_in_branch_group.pop
759
-
760
- @paths_in_branch[-1] = paths_in_this_branch_group
761
-
762
- # NOTE: The current branch group is an incomplete branch group.
763
- unless branch.group.complete?
764
- @paths_in_function += paths_to_enter_this_branch_group
765
- @paths_in_branch[-1] += paths_to_enter_this_branch_group
766
- end
767
- end
768
- end
769
- end
770
-
771
- class FN_CYCM < MetricMeasurement
772
- def_registrant_phase C::Prepare2Phase
773
-
774
- def initialize(context)
775
- super
776
- @fpath = context[:sources].first.fpath
777
- visitor = context[:c_visitor]
778
- visitor.enter_ansi_function_definition += method(:enter_function)
779
- visitor.leave_ansi_function_definition += method(:leave_function)
780
- visitor.enter_kandr_function_definition += method(:enter_function)
781
- visitor.leave_kandr_function_definition += method(:leave_function)
782
- visitor.enter_if_statement += method(:enter_selection)
783
- visitor.enter_if_else_statement += method(:enter_selection)
784
- visitor.enter_case_labeled_statement += method(:enter_selection)
785
- @current_function = nil
786
- @complexity = 0
787
- end
788
-
789
- private
790
- def do_prepare(context) end
791
- def do_execute(context) end
792
-
793
- def enter_function(function_definition)
794
- if @fpath == function_definition.location.fpath
795
- @current_function = function_definition
796
- @complexity = 0
797
- end
798
- end
799
-
800
- def leave_function(function_definition)
801
- return unless @current_function
802
-
803
- FN_CYCM(FunctionIdentifier.new(@current_function.identifier.value,
804
- @current_function.signature.to_s),
805
- @current_function.location, @complexity + 1)
806
-
807
- @current_function = nil
808
- @total_branch_count = 0
809
- end
810
-
811
- def enter_selection(if_statement)
812
- @complexity += 1 if @current_function
813
- end
814
- end
815
-
816
- end
817
- end
818
- end