adlint 2.6.14 → 3.0.0

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 (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,7 +1,7 @@
1
1
  # Kernel of the abstract interpreter of C language.
2
2
  #
3
3
  # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
- # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
4
+ # Copyright:: Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
5
5
  # License:: GPLv3+: GNU General Public License version 3 or later
6
6
  #
7
7
  # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
@@ -11,7 +11,7 @@
11
11
  # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
12
  # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
13
  # / __ |/ /_/ / /___/ / /| / / /
14
- # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
14
+ # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
15
15
  #
16
16
  # This file is part of AdLint.
17
17
  #
@@ -30,23 +30,24 @@
30
30
  #++
31
31
 
32
32
  require "adlint/monitor"
33
- require "adlint/c/environ"
34
- require "adlint/c/resolver"
35
- require "adlint/c/mediator"
36
- require "adlint/c/syntax"
37
- require "adlint/c/expr"
38
- require "adlint/c/conv"
39
- require "adlint/c/option"
40
- require "adlint/c/operator"
41
- require "adlint/c/util"
33
+ require "adlint/util"
34
+ require "adlint/cc1/environ"
35
+ require "adlint/cc1/resolver"
36
+ require "adlint/cc1/mediator"
37
+ require "adlint/cc1/syntax"
38
+ require "adlint/cc1/expr"
39
+ require "adlint/cc1/conv"
40
+ require "adlint/cc1/option"
41
+ require "adlint/cc1/operator"
42
+ require "adlint/cc1/util"
42
43
 
43
44
  module AdLint #:nodoc:
44
- module C #:nodoc:
45
+ module Cc1 #:nodoc:
45
46
 
46
47
  class Program
47
- def initialize(interp, trans_unit)
48
+ def initialize(interp, tunit)
48
49
  @interpreter = interp
49
- @translation_unit = trans_unit
50
+ @translation_unit = tunit
50
51
  end
51
52
 
52
53
  def execute
@@ -73,10 +74,10 @@ module C #:nodoc:
73
74
  include InterpreterOptions
74
75
  include BranchOptions
75
76
 
76
- def initialize(type_table)
77
- type_table = type_table
78
- @environment = Environment.new(type_table)
79
- @type_resolver = DynamicTypeResolver.new(type_table, self)
77
+ def initialize(type_tbl)
78
+ @type_table = type_tbl
79
+ @environment = Environment.new(type_tbl)
80
+ @type_resolver = DynamicTypeResolver.new(type_tbl, self)
80
81
 
81
82
  @sub_interpreters = [
82
83
  DeclarationInterpreter.new(self),
@@ -97,6 +98,12 @@ module C #:nodoc:
97
98
  attr_reader :environment
98
99
  attr_reader :type_resolver
99
100
 
101
+ extend Forwardable
102
+
103
+ def_delegator :@type_table, :traits
104
+ def_delegator :@type_table, :monitor
105
+ def_delegator :@type_table, :logger
106
+
100
107
  extend Pluggable
101
108
 
102
109
  def self.def_plugin_and_notifier(event_name, *arg_names)
@@ -122,10 +129,10 @@ module C #:nodoc:
122
129
  def_plugin_and_notifier :variable_initialized, :var_def, :var, :init_var
123
130
 
124
131
  # NOTE: Notified when the interpreter evaluates a function-declaration.
125
- def_plugin_and_notifier :function_declared, :func_dcl, :func
132
+ def_plugin_and_notifier :explicit_function_declared, :fun_dcl, :fun
126
133
 
127
134
  # NOTE: Notified when the interpreter evaluates a function-definition.
128
- def_plugin_and_notifier :function_defined, :func_def, :func
135
+ def_plugin_and_notifier :explicit_function_defined, :fun_def, :fun
129
136
 
130
137
  # NOTE: Notified when the interpreter evaluates a struct-type-declaration.
131
138
  def_plugin_and_notifier :struct_declared, :struct_type_dcl
@@ -141,11 +148,11 @@ module C #:nodoc:
141
148
 
142
149
  # NOTE: Notified when the interpreter starts execution of a
143
150
  # function-definition.
144
- def_plugin_and_notifier :function_started, :func_def, :func
151
+ def_plugin_and_notifier :function_started, :fun_def, :fun
145
152
 
146
153
  # NOTE: Notified when the interpreter ends execution of a
147
154
  # function-definition.
148
- def_plugin_and_notifier :function_ended, :func_def, :func
155
+ def_plugin_and_notifier :function_ended, :fun_def, :fun
149
156
 
150
157
  # NOTE: Notified when the interpreter evaluates a parameter-definition at
151
158
  # beginning of execution of a function-definition.
@@ -169,83 +176,85 @@ module C #:nodoc:
169
176
 
170
177
  # NOTE: Notified when the interpreter refers to a function object while
171
178
  # evaluating an expression.
172
- def_plugin_and_notifier :function_referred, :expr, :func
179
+ def_plugin_and_notifier :function_referred, :expr, :fun
180
+
181
+ # NOTE: Notified when the interpreter creates function-declaration of an
182
+ # implicit function.
183
+ def_plugin_and_notifier :implicit_function_declared, :obj_spec, :fun
173
184
 
174
185
  # NOTE: Notified when the interpreter evaluates a sizeof-expression.
175
- def_plugin_and_notifier :sizeof_expr_evaled,
176
- :expr, :operand_var, :result_var
186
+ def_plugin_and_notifier :sizeof_expr_evaled, :expr, :ope_var, :res_var
177
187
 
178
188
  # NOTE: Notified when the interpreter evaluates a sizeof-type-expression.
179
- def_plugin_and_notifier :sizeof_type_expr_evaled, :expr, :type, :result_var
189
+ def_plugin_and_notifier :sizeof_type_expr_evaled, :expr, :type, :res_var
180
190
 
181
191
  # NOTE: Notified when the interpreter evaluates a cast-expression.
182
- def_plugin_and_notifier :explicit_conv_performed,
183
- :expr, :orig_var, :result_var
192
+ def_plugin_and_notifier :explicit_conv_performed, :expr, :org_var, :res_var
184
193
 
185
194
  # NOTE: Notified when the interpreter performs an implicit type conversion
186
195
  # while evaluating an expression.
187
196
  def_plugin_and_notifier :implicit_conv_performed,
188
- :init_or_expr, :orig_var, :result_var
197
+ :init_or_expr, :org_var, :res_var
189
198
 
190
199
  # NOTE: Notified when the interpreter evaluates an
191
200
  # array-subscript-expression.
192
201
  def_plugin_and_notifier :array_subscript_expr_evaled,
193
- :expr, :ary_or_ptr, :subs, :ary_var, :result_var
202
+ :expr, :ary_or_ptr, :subs, :ary_var, :res_var
194
203
 
195
204
  # NOTE: Notified when the interpreter evaluates a function-call-expression.
196
205
  def_plugin_and_notifier :function_call_expr_evaled,
197
- :expr, :func, :arg_vars, :result_var
206
+ :expr, :fun, :arg_vars, :res_var
198
207
 
199
208
  # NOTE: Notified when the interpreter evaluates an
200
209
  # unary-arithmetic-expression.
201
210
  def_plugin_and_notifier :unary_arithmetic_expr_evaled,
202
- :expr, :operand_var, :result_var
211
+ :expr, :ope_var, :res_var
203
212
 
204
213
  # NOTE: Notified when the interpreter evaluates a
205
214
  # multiplicative-expression.
206
215
  def_plugin_and_notifier :multiplicative_expr_evaled,
207
- :expr, :lhs_var, :rhs_var, :result_var
216
+ :expr, :lhs_var, :rhs_var, :res_var
208
217
 
209
218
  # NOTE: Notified when the interpreter evaluates an additive-expression.
210
219
  def_plugin_and_notifier :additive_expr_evaled,
211
- :expr, :lhs_var, :rhs_var, :result_var
220
+ :expr, :lhs_var, :rhs_var, :res_var
212
221
 
213
222
  # NOTE: Notified when the interpreter evaluates a shift-expression.
214
223
  def_plugin_and_notifier :shift_expr_evaled,
215
- :expr, :lhs_var, :rhs_var, :result_var
224
+ :expr, :lhs_var, :rhs_var, :res_var
216
225
 
217
226
  # NOTE: Notified when the interpreter evaluates a relational-expression.
218
227
  def_plugin_and_notifier :relational_expr_evaled,
219
- :expr, :lhs_var, :rhs_var, :result_var
228
+ :expr, :lhs_var, :rhs_var, :res_var
220
229
 
221
230
  # NOTE: Notified when the interpreter evaluates an equality-expression.
222
231
  def_plugin_and_notifier :equality_expr_evaled,
223
- :expr, :lhs_var, :rhs_var, :result_var
232
+ :expr, :lhs_var, :rhs_var, :res_var
224
233
 
225
234
  # NOTE: Notified when the interpreter evaluates a bitwise and-expression.
226
235
  def_plugin_and_notifier :and_expr_evaled,
227
- :expr, :lhs_var, :rhs_var, :result_var
236
+ :expr, :lhs_var, :rhs_var, :res_var
228
237
 
229
238
  # NOTE: Notified when the interpreter evaluates an exclusive-or-expression.
230
239
  def_plugin_and_notifier :exclusive_or_expr_evaled,
231
- :expr, :lhs_var, :rhs_var, :result_var
240
+ :expr, :lhs_var, :rhs_var, :res_var
232
241
 
233
242
  # NOTE: Notified when the interpreter evaluates a bitwise
234
243
  # inclusive-or-expression.
235
244
  def_plugin_and_notifier :inclusive_or_expr_evaled,
236
- :expr, :lhs_var, :rhs_var, :result_var
245
+ :expr, :lhs_var, :rhs_var, :res_var
237
246
 
238
247
  # NOTE: Notified when the interpreter evaluates a logical-and-expression.
239
248
  def_plugin_and_notifier :logical_and_expr_evaled,
240
- :expr, :lhs_var, :rhs_var, :result_var
249
+ :expr, :lhs_var, :rhs_var, :res_var
241
250
 
242
251
  # NOTE: Notified when the interpreter evaluates a logical-or-expression.
243
252
  def_plugin_and_notifier :logical_or_expr_evaled,
244
- :expr, :lhs_var, :rhs_var, :result_var
253
+ :expr, :lhs_var, :rhs_var, :res_var
245
254
 
246
255
  # NOTE: Notified when the interpreter evaluates a conditional-expression.
247
256
  def_plugin_and_notifier :conditional_expr_evaled,
248
- :expr, :ctrlexpr_var, :result_var
257
+ :expr, :ctrlexpr_var, :res_var
249
258
 
250
259
  # NOTE: Notified when the interpreter evaluates an address-expression.
251
260
  def_plugin_and_notifier :address_expr_evaled, :expr, :obj, :ptr_var
@@ -263,22 +272,22 @@ module C #:nodoc:
263
272
  # NOTE: Notified when the interpreter evaluates a
264
273
  # prefix-increment-expression.
265
274
  def_plugin_and_notifier :prefix_increment_expr_evaled,
266
- :expr, :operand_var, :orig_val
275
+ :expr, :ope_var, :org_val
267
276
 
268
277
  # NOTE: Notified when the interpreter evaluates a
269
278
  # postfix-increment-expression.
270
279
  def_plugin_and_notifier :postfix_increment_expr_evaled,
271
- :expr, :operand_var, :result_var
280
+ :expr, :ope_var, :res_var
272
281
 
273
282
  # NOTE: Notified when the interpreter evaluates a
274
283
  # prefix-decrement-expression.
275
284
  def_plugin_and_notifier :prefix_decrement_expr_evaled,
276
- :expr, :operand_var, :orig_val
285
+ :expr, :ope_var, :org_val
277
286
 
278
287
  # NOTE: Notified when the interpreter evaluates a
279
288
  # postfix-decrement-expression.
280
289
  def_plugin_and_notifier :postfix_decrement_expr_evaled,
281
- :expr, :operand_var, :result_var
290
+ :expr, :ope_var, :res_var
282
291
 
283
292
  # NOTE: Notified when the interpreter evaluates a
284
293
  # simple-assignment-expression or a compound-assignment-expression.
@@ -330,10 +339,10 @@ module C #:nodoc:
330
339
  def_plugin_and_notifier :goto_stmt_evaled, :stmt, :label_name
331
340
 
332
341
  # NOTE: Notified when the interpreter evaluates a return-statement.
333
- def_plugin_and_notifier :return_stmt_evaled, :stmt, :result_var
342
+ def_plugin_and_notifier :return_stmt_evaled, :stmt, :retn_var
334
343
 
335
344
  # NOTE: Notified when the interpreter evaluates an implicit return.
336
- def_plugin_and_notifier :implicit_return_evaled
345
+ def_plugin_and_notifier :implicit_return_evaled, :loc
337
346
 
338
347
  # NOTE: Notified when the interpreter evaluates a controlling expression of
339
348
  # the if-statement.
@@ -393,16 +402,16 @@ module C #:nodoc:
393
402
 
394
403
  # NOTE: Notified when the interpreter starts execution of a
395
404
  # translation-unit.
396
- def_plugin_and_notifier :translation_unit_started, :trans_unit
405
+ def_plugin_and_notifier :translation_unit_started, :tunit
397
406
 
398
407
  # NOTE: Notified when the interpreter ends execution of a translation-unit.
399
- def_plugin_and_notifier :translation_unit_ended, :trans_unit
408
+ def_plugin_and_notifier :translation_unit_ended, :tunit
400
409
 
401
410
  # NOTE: Notified when the control reaches to a sequence-point.
402
411
  def_plugin_and_notifier :sequence_point_reached, :seqp
403
412
 
404
413
  def execute(node, *opts)
405
- @options_stack.push(current_options + opts)
414
+ @options_stack.push(cur_opts + opts)
406
415
  if quiet_without_side_effect?
407
416
  result = nil
408
417
  branched_eval(nil, FINAL) do
@@ -421,9 +430,9 @@ module C #:nodoc:
421
430
  def object_to_variable(obj)
422
431
  case
423
432
  when obj.function?
424
- create_tempvar(pointer_type(obj.type), pointer_value_of(obj))
433
+ create_tmpvar(pointer_type(obj.type), pointer_value_of(obj))
425
434
  when obj.type.array?
426
- create_tempvar(pointer_type(obj.type.base_type), pointer_value_of(obj))
435
+ create_tmpvar(pointer_type(obj.type.base_type), pointer_value_of(obj))
427
436
  else
428
437
  obj
429
438
  end
@@ -438,33 +447,32 @@ module C #:nodoc:
438
447
  end
439
448
 
440
449
  def pointer_value_of(obj)
441
- ScalarValue.of(obj.binding.memory.address)
450
+ scalar_value_of(obj.binding.memory.address)
442
451
  end
443
452
 
444
453
  def quiet?
445
- current_options.include?(QUIET) ||
446
- current_options.include?(QUIET_WITHOUT_SIDE_EFFECT)
454
+ cur_opts.include?(QUIET) || cur_opts.include?(QUIET_WITHOUT_SIDE_EFFECT)
447
455
  end
448
456
 
449
457
  def _quiet=(quiet)
450
458
  # NOTE: This method is called only from ControllingExpression.
451
459
  if quiet
452
- current_options.add(QUIET)
460
+ cur_opts.add(QUIET)
453
461
  else
454
- current_options.delete(QUIET)
462
+ cur_opts.delete(QUIET)
455
463
  end
456
464
  end
457
465
 
458
466
  def quiet_without_side_effect?
459
- current_options.include?(QUIET_WITHOUT_SIDE_EFFECT)
467
+ cur_opts.include?(QUIET_WITHOUT_SIDE_EFFECT)
460
468
  end
461
469
 
462
470
  def _quiet_without_side_effect=(quiet_without_side_effect)
463
471
  # NOTE: This method is called only from ExpressionEvaluator.
464
472
  if quiet_without_side_effect
465
- current_options.add(QUIET_WITHOUT_SIDE_EFFECT)
473
+ cur_opts.add(QUIET_WITHOUT_SIDE_EFFECT)
466
474
  else
467
- current_options.delete(QUIET_WITHOUT_SIDE_EFFECT)
475
+ cur_opts.delete(QUIET_WITHOUT_SIDE_EFFECT)
468
476
  end
469
477
  end
470
478
 
@@ -476,9 +484,9 @@ module C #:nodoc:
476
484
  @active_function_stack.last
477
485
  end
478
486
 
479
- def _enter_function(func_def)
487
+ def _enter_function(fun_def)
480
488
  # NOTE: This method is called only from FunctionInterpreter.
481
- @active_function_stack.push(func_def)
489
+ @active_function_stack.push(fun_def)
482
490
  end
483
491
 
484
492
  def _leave_function(*)
@@ -493,7 +501,7 @@ module C #:nodoc:
493
501
  end
494
502
  end
495
503
 
496
- def current_options
504
+ def cur_opts
497
505
  @options_stack.last || Set.new
498
506
  end
499
507
 
@@ -505,11 +513,12 @@ module C #:nodoc:
505
513
  end
506
514
 
507
515
  class SubInterpreter < SyntaxTreeVisitor
516
+ include InterpreterOptions
508
517
  include InterpreterMediator
509
518
  include NotifierMediator
510
519
  include Conversion
511
520
  include MonitorUtil
512
- include InterpreterOptions
521
+ include LogUtil
513
522
 
514
523
  def initialize(owner, target_node_class)
515
524
  @owner = owner
@@ -520,8 +529,19 @@ module C #:nodoc:
520
529
 
521
530
  private
522
531
  def interpreter
532
+ # NOTE: This is private attr_reader for InterpreterMediator.
533
+ # This attribute is read via a normal method to suppress
534
+ # `private attribute?' warning.
523
535
  @owner
524
536
  end
537
+
538
+ extend Forwardable
539
+
540
+ def_delegator :interpreter, :monitor
541
+ private :monitor
542
+
543
+ def_delegator :interpreter, :logger
544
+ private :logger
525
545
  end
526
546
 
527
547
  class DeclarationInterpreter < SubInterpreter
@@ -537,8 +557,8 @@ module C #:nodoc:
537
557
  dcl.mark_as_referred_by(node.identifier)
538
558
  end
539
559
 
540
- func = declare_function(node)
541
- notify_function_declared(node, func)
560
+ fun = declare_explicit_function(node)
561
+ notify_explicit_function_declared(node, fun)
542
562
  evaluate_sequence_point(node.init_declarator.declarator)
543
563
  end
544
564
 
@@ -622,8 +642,8 @@ module C #:nodoc:
622
642
  notify_typedef_declared(node)
623
643
  evaluate_sequence_point(node.init_declarator.declarator)
624
644
 
625
- Analyzer.current.info("user type `#{node.identifier.value}' " +
626
- "defined at #{node.location.to_s}.")
645
+ LOG_I("user-type `#{node.identifier.value}' " +
646
+ "defined at #{node.location.to_s}.")
627
647
  end
628
648
 
629
649
  private
@@ -638,7 +658,7 @@ module C #:nodoc:
638
658
  # string-literal-specifier as the initializer.
639
659
  if var_def.type.array? && var.type.pointer?
640
660
  unless ary = pointee_of(var) and ary.type.array?
641
- ary = create_tempvar(var_def.type)
661
+ ary = create_tmpvar(var_def.type)
642
662
  end
643
663
  deduct_array_length_from_array_variable(var_def, ary)
644
664
  var = conved = ary
@@ -656,8 +676,8 @@ module C #:nodoc:
656
676
  end
657
677
  end
658
678
 
659
- def evaluate_sequence_point(full_dcl)
660
- if seqp = full_dcl.subsequent_sequence_point
679
+ def evaluate_sequence_point(full_dcr)
680
+ if seqp = full_dcr.subsequent_sequence_point
661
681
  notify_sequence_point_reached(seqp)
662
682
  end
663
683
  end
@@ -694,11 +714,11 @@ module C #:nodoc:
694
714
  conved = var
695
715
  else
696
716
  conved = do_conversion(var, var_def.type) ||
697
- create_tempvar(var_def.type)
717
+ create_tmpvar(var_def.type)
698
718
  notify_implicit_conv_performed(inits, var, conved)
699
719
  end
700
720
  else
701
- var = conved = create_tempvar(var_def.type)
721
+ var = conved = create_tmpvar(var_def.type)
702
722
  end
703
723
 
704
724
  return var, conved
@@ -715,7 +735,7 @@ module C #:nodoc:
715
735
  if var.type.same_as?(type)
716
736
  conved = var
717
737
  else
718
- conved = do_conversion(var, type) || create_tempvar(type)
738
+ conved = do_conversion(var, type) || create_tmpvar(type)
719
739
  notify_implicit_conv_performed(expr, var, conved)
720
740
  end
721
741
 
@@ -744,9 +764,9 @@ module C #:nodoc:
744
764
  # (recursively) according to these rules.
745
765
  if fst_memb = type.members.first
746
766
  fst_obj = evaluate_initializers(inits, fst_memb.type)
747
- return create_tempvar(type, value_of(fst_obj))
767
+ return create_tmpvar(type, value_of(fst_obj))
748
768
  else
749
- return create_tempvar(type)
769
+ return create_tmpvar(type)
750
770
  end
751
771
  when type.array?
752
772
  # NOTE: The ISO C99 standard says;
@@ -794,22 +814,22 @@ module C #:nodoc:
794
814
 
795
815
  case
796
816
  when type.array?
797
- create_tempvar(type, ArrayValue.new(vals))
817
+ create_tmpvar(type, ArrayValue.new(vals))
798
818
  when type.composite?
799
- create_tempvar(type, CompositeValue.new(vals))
819
+ create_tmpvar(type, CompositeValue.new(vals))
800
820
  else
801
- create_tempvar(type, vals.first)
821
+ create_tmpvar(type, vals.first)
802
822
  end
803
823
  end
804
824
 
805
- def deduct_array_length_from_initializers(orig_ary_type, inits)
806
- unless orig_ary_type.length
807
- if orig_ary_type.user?
808
- orig_ary_type = orig_ary_type.dup
825
+ def deduct_array_length_from_initializers(org_ary_type, inits)
826
+ unless org_ary_type.length
827
+ if org_ary_type.user?
828
+ org_ary_type = org_ary_type.dup
809
829
  end
810
- orig_ary_type.length = inits.size
830
+ org_ary_type.length = inits.size
811
831
  end
812
- orig_ary_type
832
+ org_ary_type
813
833
  end
814
834
 
815
835
  def interpreter
@@ -818,6 +838,11 @@ module C #:nodoc:
818
838
  # `private attribute?' warning.
819
839
  @interpreter
820
840
  end
841
+
842
+ extend Forwardable
843
+
844
+ def_delegator :interpreter, :monitor
845
+ private :monitor
821
846
  end
822
847
 
823
848
  class ParameterDefinitionInterpreter < SubInterpreter
@@ -829,15 +854,17 @@ module C #:nodoc:
829
854
  checkpoint(node.location)
830
855
 
831
856
  resolve_unresolved_type(node)
857
+ id = node.identifier
858
+
832
859
  node.type.declarations.each do |dcl|
833
- if identifier = node.identifier
834
- dcl.mark_as_referred_by(identifier)
860
+ if id
861
+ dcl.mark_as_referred_by(id)
835
862
  else
836
863
  dcl.mark_as_referred_by(node.head_token)
837
864
  end
838
865
  end
839
866
 
840
- if node.identifier
867
+ if id
841
868
  var = define_variable(node.to_variable_definition,
842
869
  node.type.parameter_value)
843
870
  notify_parameter_defined(node, var)
@@ -859,49 +886,50 @@ module C #:nodoc:
859
886
  end
860
887
 
861
888
  private
862
- def interpret_function(node)
863
- checkpoint(node.location)
889
+ def interpret_function(fun_def)
890
+ checkpoint(fun_def.location)
864
891
 
865
892
  reset_environment
866
- resolve_unresolved_type(node)
867
- func = lookup_or_define_function(node)
868
- notify_function_defined(node, func)
869
-
870
- begin
871
- interpreter._enter_function(node)
872
- scoped_eval do
873
- notify_function_started(node, func)
874
- notify_block_started(node.function_body)
893
+ resolve_unresolved_type(fun_def)
894
+ fun = lookup_or_define_function(fun_def)
895
+ notify_explicit_function_defined(fun_def, fun)
875
896
 
876
- node.parameter_definitions.each { |param_def| interpret(param_def) }
897
+ interpret_function_body(fun_def, fun) if fun_def.analysis_target?(traits)
898
+ end
877
899
 
878
- BreakEvent.catch do
879
- node.function_body.block_items.each { |item| interpret(item) }
880
- notify_implicit_return_evaled
881
- end
900
+ def interpret_function_body(fun_def, fun)
901
+ interpreter._enter_function(fun_def)
902
+ scoped_eval do
903
+ notify_function_started(fun_def, fun)
904
+ notify_block_started(fun_def.function_body)
882
905
 
883
- notify_block_ended(node.function_body)
884
- notify_function_ended(node, func)
906
+ fun_def.parameter_definitions.each { |param_def| interpret(param_def) }
907
+ BreakEvent.catch do
908
+ fun_def.function_body.block_items.each { |item| interpret(item) }
909
+ notify_implicit_return_evaled(fun_def.function_body.tail_location)
885
910
  end
886
- ensure
887
- interpreter._leave_function(node)
911
+
912
+ notify_block_ended(fun_def.function_body)
913
+ notify_function_ended(fun_def, fun)
888
914
  end
915
+ ensure
916
+ interpreter._leave_function(fun_def)
889
917
  end
890
918
 
891
- def lookup_or_define_function(func_def)
892
- func_def.type.declarations.each do |dcl|
893
- dcl.mark_as_referred_by(func_def.identifier)
919
+ def lookup_or_define_function(fun_def)
920
+ fun_def.type.declarations.each do |dcl|
921
+ dcl.mark_as_referred_by(fun_def.identifier)
894
922
  end
895
923
 
896
- if func = function_named(func_def.identifier.value)
897
- func.declarations_and_definitions.each do |dcl_or_def|
898
- dcl_or_def.mark_as_referred_by(func_def.identifier)
924
+ if fun = function_named(fun_def.identifier.value) and fun.explicit?
925
+ fun.declarations_and_definitions.each do |dcl_or_def|
926
+ dcl_or_def.mark_as_referred_by(fun_def.identifier)
899
927
  end
900
- func.declarations_and_definitions.push(func_def)
928
+ fun.declarations_and_definitions.push(fun_def)
929
+ fun
901
930
  else
902
- func = define_explicit_function(func_def)
931
+ define_explicit_function(fun_def)
903
932
  end
904
- func
905
933
  end
906
934
  end
907
935
 
@@ -976,16 +1004,16 @@ module C #:nodoc:
976
1004
 
977
1005
  node.executed = true
978
1006
 
979
- orig_ctrlexpr = node.expression
980
- if orig_ctrlexpr == effective_ctrlexpr
981
- ctrlexpr_val = ScalarValue.of_arbitrary
1007
+ org_ctrlexpr = node.expression
1008
+ if org_ctrlexpr == effective_ctrlexpr
1009
+ ctrlexpr_val = scalar_value_of_arbitrary
982
1010
  ctrlexpr = nil
983
1011
  else
984
- ctrlexpr_var = object_to_variable(interpret(orig_ctrlexpr))
1012
+ ctrlexpr_var = object_to_variable(interpret(org_ctrlexpr))
985
1013
  ctrlexpr_val = value_of(ctrlexpr_var)
986
- notify_variable_value_referred(orig_ctrlexpr, ctrlexpr_var)
987
- notify_sequence_point_reached(SequencePoint.new(orig_ctrlexpr))
988
- ctrlexpr = orig_ctrlexpr.to_normalized_logical
1014
+ notify_variable_value_referred(org_ctrlexpr, ctrlexpr_var)
1015
+ notify_sequence_point_reached(SequencePoint.new(org_ctrlexpr))
1016
+ ctrlexpr = org_ctrlexpr.to_normalized_logical
989
1017
  end
990
1018
  notify_if_ctrlexpr_evaled(node, ctrlexpr_val)
991
1019
 
@@ -1009,16 +1037,16 @@ module C #:nodoc:
1009
1037
 
1010
1038
  node.executed = true
1011
1039
 
1012
- orig_ctrlexpr = node.expression
1013
- if orig_ctrlexpr == effective_ctrlexpr
1014
- ctrlexpr_val = ScalarValue.of_arbitrary
1040
+ org_ctrlexpr = node.expression
1041
+ if org_ctrlexpr == effective_ctrlexpr
1042
+ ctrlexpr_val = scalar_value_of_arbitrary
1015
1043
  ctrlexpr = nil
1016
1044
  else
1017
- ctrlexpr_var = object_to_variable(interpret(orig_ctrlexpr))
1045
+ ctrlexpr_var = object_to_variable(interpret(org_ctrlexpr))
1018
1046
  ctrlexpr_val = value_of(ctrlexpr_var)
1019
- notify_variable_value_referred(orig_ctrlexpr, ctrlexpr_var)
1020
- notify_sequence_point_reached(SequencePoint.new(orig_ctrlexpr))
1021
- ctrlexpr = orig_ctrlexpr.to_normalized_logical
1047
+ notify_variable_value_referred(org_ctrlexpr, ctrlexpr_var)
1048
+ notify_sequence_point_reached(SequencePoint.new(org_ctrlexpr))
1049
+ ctrlexpr = org_ctrlexpr.to_normalized_logical
1022
1050
  end
1023
1051
  notify_if_else_ctrlexpr_evaled(node, ctrlexpr_val)
1024
1052
 
@@ -1038,7 +1066,7 @@ module C #:nodoc:
1038
1066
  when IfStatement, IfElseStatement
1039
1067
  interpret(node.else_statement)
1040
1068
  else
1041
- branched_eval(nil, NARROWING, FINAL, COMPLETE) do
1069
+ branched_eval(nil, NARROWING, COMPLEMENTAL, FINAL, COMPLETE) do
1042
1070
  interpret(node.else_statement)
1043
1071
  end
1044
1072
  end
@@ -1058,26 +1086,26 @@ module C #:nodoc:
1058
1086
  notify_sequence_point_reached(SequencePoint.new(node.expression))
1059
1087
  notify_while_ctrlexpr_evaled(node, ctrlexpr_val)
1060
1088
 
1061
- orig_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1089
+ org_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1062
1090
 
1063
1091
  case
1064
1092
  when ctrlexpr_val.must_be_true?
1065
1093
  begin
1066
- enter_iteration_statement(orig_ctrlexpr)
1094
+ enter_iteration_statement(org_ctrlexpr)
1067
1095
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND, COMPLETE) do
1068
1096
  interpret(node.statement)
1069
1097
  end
1070
1098
  ensure
1071
- leave_iteration_statement(orig_ctrlexpr)
1099
+ leave_iteration_statement(org_ctrlexpr)
1072
1100
  end
1073
1101
  when ctrlexpr_val.may_be_true?
1074
1102
  begin
1075
- enter_iteration_statement(orig_ctrlexpr)
1103
+ enter_iteration_statement(org_ctrlexpr)
1076
1104
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND) do
1077
1105
  interpret(node.statement)
1078
1106
  end
1079
1107
  ensure
1080
- leave_iteration_statement(orig_ctrlexpr)
1108
+ leave_iteration_statement(org_ctrlexpr)
1081
1109
  end
1082
1110
  end
1083
1111
  ensure
@@ -1092,15 +1120,15 @@ module C #:nodoc:
1092
1120
 
1093
1121
  widen_varying_variable_value_domain(node)
1094
1122
 
1095
- orig_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1123
+ org_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1096
1124
 
1097
1125
  begin
1098
- enter_iteration_statement(orig_ctrlexpr)
1126
+ enter_iteration_statement(org_ctrlexpr)
1099
1127
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND, COMPLETE) do
1100
1128
  interpret(node.statement)
1101
1129
  end
1102
1130
  ensure
1103
- leave_iteration_statement(orig_ctrlexpr)
1131
+ leave_iteration_statement(org_ctrlexpr)
1104
1132
  end
1105
1133
 
1106
1134
  ctrlexpr_var = object_to_variable(interpret(node.expression))
@@ -1121,7 +1149,7 @@ module C #:nodoc:
1121
1149
  node.initial_statement.accept(self)
1122
1150
 
1123
1151
  widen_varying_variable_value_domain(node)
1124
- orig_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1152
+ org_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1125
1153
 
1126
1154
  node.condition_statement.executed = true
1127
1155
  if explicit_ctrlexpr = node.condition_statement.expression
@@ -1131,14 +1159,14 @@ module C #:nodoc:
1131
1159
  notify_sequence_point_reached(SequencePoint.new(explicit_ctrlexpr))
1132
1160
  notify_for_ctrlexpr_evaled(node, ctrlexpr_val)
1133
1161
  else
1134
- ctrlexpr_val = ScalarValue.of_true
1162
+ ctrlexpr_val = scalar_value_of_true
1135
1163
  end
1136
1164
 
1137
1165
  case
1138
1166
  when ctrlexpr_val.must_be_true?
1139
- interpret_for_body_statement(node, orig_ctrlexpr, ctrlexpr, true)
1167
+ interpret_for_body_statement(node, org_ctrlexpr, ctrlexpr, true)
1140
1168
  when ctrlexpr_val.may_be_true?
1141
- interpret_for_body_statement(node, orig_ctrlexpr, ctrlexpr, false)
1169
+ interpret_for_body_statement(node, org_ctrlexpr, ctrlexpr, false)
1142
1170
  end
1143
1171
  ensure
1144
1172
  notify_for_stmt_ended(node)
@@ -1154,7 +1182,7 @@ module C #:nodoc:
1154
1182
  notify_c99_for_stmt_started(node)
1155
1183
 
1156
1184
  widen_varying_variable_value_domain(node)
1157
- orig_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1185
+ org_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1158
1186
 
1159
1187
  node.condition_statement.executed = true
1160
1188
  if explicit_ctrlexpr = node.condition_statement.expression
@@ -1164,14 +1192,14 @@ module C #:nodoc:
1164
1192
  notify_sequence_point_reached(SequencePoint.new(explicit_ctrlexpr))
1165
1193
  notify_c99_for_ctrlexpr_evaled(node, ctrlexpr_val)
1166
1194
  else
1167
- ctrlexpr_val = ScalarValue.of_true
1195
+ ctrlexpr_val = scalar_value_of_true
1168
1196
  end
1169
1197
 
1170
1198
  case
1171
1199
  when ctrlexpr_val.must_be_true?
1172
- interpret_for_body_statement(node, orig_ctrlexpr, ctrlexpr, true)
1200
+ interpret_for_body_statement(node, org_ctrlexpr, ctrlexpr, true)
1173
1201
  when ctrlexpr_val.may_be_true?
1174
- interpret_for_body_statement(node, orig_ctrlexpr, ctrlexpr, false)
1202
+ interpret_for_body_statement(node, org_ctrlexpr, ctrlexpr, false)
1175
1203
  end
1176
1204
  end
1177
1205
  ensure
@@ -1218,13 +1246,12 @@ module C #:nodoc:
1218
1246
 
1219
1247
  notify_variable_value_referred(node.expression, var)
1220
1248
 
1221
- if active_func = interpreter._active_function and
1222
- return_type = active_func.type.return_type
1223
- if var.type.same_as?(return_type)
1249
+ if active_fun = interpreter._active_function and
1250
+ retn_type = active_fun.type.return_type
1251
+ if var.type.same_as?(retn_type)
1224
1252
  conved = var
1225
1253
  else
1226
- conved = do_conversion(var, return_type) ||
1227
- create_tempvar(return_type)
1254
+ conved = do_conversion(var, retn_type) || create_tmpvar(retn_type)
1228
1255
  notify_implicit_conv_performed(node.expression, var, conved)
1229
1256
  end
1230
1257
  else
@@ -1237,8 +1264,8 @@ module C #:nodoc:
1237
1264
  end
1238
1265
 
1239
1266
  private
1240
- def interpret_for_body_statement(node, orig_ctrlexpr, ctrlexpr, complete)
1241
- enter_iteration_statement(orig_ctrlexpr)
1267
+ def interpret_for_body_statement(node, org_ctrlexpr, ctrlexpr, complete)
1268
+ enter_iteration_statement(org_ctrlexpr)
1242
1269
 
1243
1270
  if complete
1244
1271
  branch_opts = [NARROWING, FINAL, IMPLICIT_COND, COMPLETE]
@@ -1267,7 +1294,7 @@ module C #:nodoc:
1267
1294
  end
1268
1295
  end
1269
1296
  ensure
1270
- leave_iteration_statement(orig_ctrlexpr)
1297
+ leave_iteration_statement(org_ctrlexpr)
1271
1298
  end
1272
1299
 
1273
1300
  def uninitialize_block_local_variables(generic_labeled_stmt)
@@ -1300,12 +1327,12 @@ module C #:nodoc:
1300
1327
  end
1301
1328
  end
1302
1329
 
1303
- varying_vars.each do |var, orig_val|
1330
+ varying_vars.each do |var, org_val|
1304
1331
  case deduct_variable_varying_path(var, iteration_stmt)
1305
1332
  when :increase
1306
- var.narrow_value_domain!(Operator::GE, orig_val)
1333
+ var.narrow_value_domain!(Operator::GE, org_val)
1307
1334
  when :decrease
1308
- var.narrow_value_domain!(Operator::LE, orig_val)
1335
+ var.narrow_value_domain!(Operator::LE, org_val)
1309
1336
  end
1310
1337
  end
1311
1338
  end
@@ -1407,6 +1434,7 @@ module C #:nodoc:
1407
1434
  ctrlexpr = node.expression
1408
1435
  ctrlexpr_var = object_to_variable(interpret(ctrlexpr))
1409
1436
  notify_switch_ctrlexpr_evaled(node, ctrlexpr_var)
1437
+ notify_variable_value_referred(ctrlexpr, ctrlexpr_var)
1410
1438
 
1411
1439
  execute_switch_body(ctrlexpr_var, node.statement)
1412
1440
  notify_switch_stmt_ended(node)
@@ -1434,34 +1462,38 @@ module C #:nodoc:
1434
1462
  base_opts = [SMOTHER_BREAK, IMPLICIT_COND, NARROWING]
1435
1463
  end
1436
1464
 
1437
- index = 0
1438
- while block_item = block_items[index]
1439
- while block_item.kind_of?(GenericLabeledStatement)
1465
+ idx = 0
1466
+ while block_item = block_items[idx]
1467
+ case block_item
1468
+ when GenericLabeledStatement
1440
1469
  block_item.executed = true
1441
1470
  notify_label_defined(block_item)
1442
1471
  block_item = block_item.statement
1443
- end
1444
-
1445
- case block_item
1472
+ redo
1446
1473
  when CaseLabeledStatement, DefaultLabeledStatement
1447
- if final_branch?(block_items, index)
1474
+ if final_branch?(block_items, idx)
1448
1475
  opts = base_opts + [FINAL]
1449
1476
  else
1450
1477
  opts = base_opts.dup
1451
1478
  end
1452
- index = execute_branch(block_item, block_items, index + 1, opts)
1453
- break unless index
1479
+ idx = execute_branch(block_item, block_items, idx, opts)
1480
+ break unless idx
1454
1481
  else
1455
1482
  interpret(block_item)
1456
- index += 1
1483
+ idx += 1
1457
1484
  end
1458
1485
  end
1459
1486
  end
1460
1487
 
1461
- def execute_branch(labeled_stmt, block_items, index, branch_opts)
1488
+ def execute_branch(labeled_stmt, block_items, idx, branch_opts)
1462
1489
  ctrlexpr = labeled_stmt.normalized_expression
1463
1490
  ctrlexpr_val = value_of(interpret(ctrlexpr, QUIET))
1464
1491
 
1492
+ case labeled_stmt
1493
+ when DefaultLabeledStatement
1494
+ branch_opts.push(COMPLEMENTAL)
1495
+ end
1496
+
1465
1497
  case
1466
1498
  when ctrlexpr_val.must_be_true?
1467
1499
  branch_opts.push(FINAL, COMPLETE)
@@ -1469,33 +1501,54 @@ module C #:nodoc:
1469
1501
  # NOTE: To end the current branch group of switch-statement if this
1470
1502
  # case-clause is the final one.
1471
1503
  branched_eval(ctrlexpr, *branch_opts) {}
1472
- return seek_next_branch(block_items, index)
1504
+ return seek_next_branch(block_items, idx)
1473
1505
  end
1474
1506
 
1475
1507
  branched_eval(ctrlexpr, *branch_opts) do |branch|
1508
+ case stmt = labeled_stmt.statement
1509
+ when CaseLabeledStatement, DefaultLabeledStatement
1510
+ # NOTE: Consecutive label appears!
1511
+ enter_next_clause(stmt, block_items, idx, branch, branch_opts)
1512
+ end
1476
1513
  interpret(labeled_stmt)
1477
- while block_item = block_items[index]
1478
- while block_item.kind_of?(GenericLabeledStatement)
1479
- block_item.executed = true
1480
- notify_label_defined(block_item)
1481
- block_item = block_item.statement
1482
- end
1483
-
1484
- case block_item
1514
+ idx += 1
1515
+
1516
+ while item = block_items[idx]
1517
+ case item
1518
+ when GenericLabeledStatement
1519
+ item.executed = true
1520
+ notify_label_defined(item)
1521
+ item = item.statement
1522
+ redo
1485
1523
  when CaseLabeledStatement, DefaultLabeledStatement
1486
1524
  # NOTE: Fall through!
1487
- prepare_fall_through(branch, branch_opts, block_item)
1488
- branch_opts.push(FINAL) if final_branch?(block_items, index)
1489
- branch.add_options(*branch_opts)
1525
+ enter_next_clause(item, block_items, idx, branch, branch_opts)
1490
1526
  end
1491
- interpret(block_item)
1492
- index += 1
1527
+ interpret(item)
1528
+ idx += 1
1493
1529
  end
1494
1530
  # NOTE: To simulate implicit breaking of the last case-clause.
1495
1531
  BreakEvent.of_break.throw
1496
1532
  end
1497
1533
 
1498
- branch_opts.include?(FINAL) ? nil : seek_next_branch(block_items, index)
1534
+ branch_opts.include?(FINAL) ? nil : seek_next_branch(block_items, idx)
1535
+ end
1536
+
1537
+ def enter_next_clause(labeled_stmt, block_items, idx, branch, branch_opts)
1538
+ prepare_fall_through(branch, branch_opts, labeled_stmt)
1539
+
1540
+ case labeled_stmt
1541
+ when DefaultLabeledStatement
1542
+ branch_opts.push(COMPLEMENTAL)
1543
+ end
1544
+
1545
+ branch_opts.push(FINAL) if final_branch?(block_items, idx)
1546
+ branch.add_options(*branch_opts)
1547
+
1548
+ case stmt = labeled_stmt.statement
1549
+ when CaseLabeledStatement, DefaultLabeledStatement
1550
+ enter_next_clause(stmt, block_items, idx, branch, branch_opts)
1551
+ end
1499
1552
  end
1500
1553
 
1501
1554
  def prepare_fall_through(branch, branch_opts, labeled_stmt)
@@ -1519,55 +1572,51 @@ module C #:nodoc:
1519
1572
  value_domain_manip.commit!
1520
1573
  end
1521
1574
 
1522
- def final_branch?(block_items, index)
1523
- index += 1
1524
- while block_item = block_items[index]
1525
- while block_item.kind_of?(GenericLabeledStatement)
1526
- block_item = block_item.statement
1527
- end
1528
-
1575
+ def final_branch?(block_items, idx)
1576
+ idx += 1
1577
+ while block_item = block_items[idx]
1529
1578
  case block_item
1579
+ when GenericLabeledStatement
1580
+ block_item = block_item.statement
1581
+ redo
1530
1582
  when CaseLabeledStatement, DefaultLabeledStatement
1531
1583
  return false
1532
1584
  else
1533
- index += 1
1585
+ idx += 1
1534
1586
  end
1535
1587
  end
1536
1588
  true
1537
1589
  end
1538
1590
 
1539
1591
  def complete?(block_items)
1540
- index = 0
1541
- while block_item = block_items[index]
1542
- while block_item.kind_of?(GenericLabeledStatement)
1543
- block_item = block_item.statement
1544
- end
1545
-
1592
+ block_items.any? do |block_item|
1546
1593
  case block_item
1594
+ when GenericLabeledStatement, CaseLabeledStatement
1595
+ block_item = block_item.statement
1596
+ redo
1547
1597
  when DefaultLabeledStatement
1548
- return true
1598
+ true
1549
1599
  else
1550
- index += 1
1600
+ false
1551
1601
  end
1552
1602
  end
1553
- false
1554
1603
  end
1555
1604
 
1556
- def seek_next_branch(block_items, index)
1557
- while block_item = block_items[index]
1558
- while block_item.kind_of?(GenericLabeledStatement)
1605
+ def seek_next_branch(block_items, idx)
1606
+ idx += 1
1607
+ while block_item = block_items[idx]
1608
+ case block_item
1609
+ when GenericLabeledStatement
1559
1610
  notify_label_defined(block_item)
1560
1611
  block_item = block_item.statement
1561
- end
1562
-
1563
- case block_item
1612
+ redo
1564
1613
  when CaseLabeledStatement, DefaultLabeledStatement
1565
- break
1614
+ return idx
1566
1615
  else
1567
- index += 1
1616
+ idx += 1
1568
1617
  end
1569
1618
  end
1570
- index
1619
+ nil
1571
1620
  end
1572
1621
  end
1573
1622
 
@@ -1660,8 +1709,8 @@ module C #:nodoc:
1660
1709
 
1661
1710
  case
1662
1711
  when then_var && else_var
1663
- result_val = then_var.value.single_value_unified_with(else_var.value)
1664
- result_var = create_tempvar(then_var.type, result_val)
1712
+ res_val = then_var.value.single_value_unified_with(else_var.value)
1713
+ res_var = create_tmpvar(then_var.type, res_val)
1665
1714
  # FIXME: Not to over-warn about discarding a function return value.
1666
1715
  # Because the unified result is a new temporary variable, it is
1667
1716
  # impossible to relate a reference of the unified result and a
@@ -1669,17 +1718,17 @@ module C #:nodoc:
1669
1718
  notify_variable_value_referred(node, then_var)
1670
1719
  notify_variable_value_referred(node, else_var)
1671
1720
  when then_var
1672
- result_var = then_var
1721
+ res_var = then_var
1673
1722
  when else_var
1674
- result_var = else_var
1723
+ res_var = else_var
1675
1724
  else
1676
1725
  # FIXME: Nevertheless, the then-expression is not reachable, the branch
1677
1726
  # execution check may fail in evaluation of the else branch.
1678
- result_var = create_tempvar
1727
+ res_var = create_tmpvar
1679
1728
  end
1680
1729
 
1681
- notify_conditional_expr_evaled(node, ctrlexpr_var, result_var)
1682
- result_var
1730
+ notify_conditional_expr_evaled(node, ctrlexpr_var, res_var)
1731
+ res_var
1683
1732
  ensure
1684
1733
  if seqp = node.subsequent_sequence_point
1685
1734
  notify_sequence_point_reached(seqp)