adlint 1.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 (465) hide show
  1. data/AUTHORS +27 -0
  2. data/COPYING +674 -0
  3. data/ChangeLog +820 -0
  4. data/INSTALL +78 -0
  5. data/MANIFEST +464 -0
  6. data/NEWS +38 -0
  7. data/README +74 -0
  8. data/Rakefile +167 -0
  9. data/TODO +29 -0
  10. data/bin/adlint +141 -0
  11. data/bin/adlint_chk +129 -0
  12. data/bin/adlint_cma +122 -0
  13. data/bin/adlint_sma +129 -0
  14. data/bin/adlintize +286 -0
  15. data/etc/conf.d/fallback/cinit.erb +11 -0
  16. data/etc/conf.d/fallback/traits.erb +216 -0
  17. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
  18. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
  19. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
  20. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
  21. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
  22. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
  23. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
  24. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
  25. data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
  26. data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
  27. data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
  28. data/etc/conf.d/noarch/pinit.erb +11 -0
  29. data/etc/mesg.d/en_US/messages.yml +784 -0
  30. data/etc/mesg.d/ja_JP/messages.yml +784 -0
  31. data/lib/adlint/analyzer.rb +294 -0
  32. data/lib/adlint/c/branch.rb +251 -0
  33. data/lib/adlint/c/builtin.rb +92 -0
  34. data/lib/adlint/c/code.rb +490 -0
  35. data/lib/adlint/c/const.rb +465 -0
  36. data/lib/adlint/c/conv.rb +212 -0
  37. data/lib/adlint/c/ctrlexpr.rb +949 -0
  38. data/lib/adlint/c/domain.rb +7499 -0
  39. data/lib/adlint/c/environ.rb +133 -0
  40. data/lib/adlint/c/expr.rb +1725 -0
  41. data/lib/adlint/c/format.rb +3209 -0
  42. data/lib/adlint/c/interp.rb +1740 -0
  43. data/lib/adlint/c/lexer.rb +241 -0
  44. data/lib/adlint/c/mediator.rb +313 -0
  45. data/lib/adlint/c/message.rb +13597 -0
  46. data/lib/adlint/c/metric.rb +765 -0
  47. data/lib/adlint/c/object.rb +1018 -0
  48. data/lib/adlint/c/parser.rb +3800 -0
  49. data/lib/adlint/c/parser.y +2054 -0
  50. data/lib/adlint/c/phase.rb +712 -0
  51. data/lib/adlint/c/resolver.rb +270 -0
  52. data/lib/adlint/c/scanner.rb +248 -0
  53. data/lib/adlint/c/scope.rb +74 -0
  54. data/lib/adlint/c/syntax.rb +4279 -0
  55. data/lib/adlint/c/type.rb +7506 -0
  56. data/lib/adlint/c/util.rb +91 -0
  57. data/lib/adlint/c/value.rb +2310 -0
  58. data/lib/adlint/c.rb +56 -0
  59. data/lib/adlint/code.rb +500 -0
  60. data/lib/adlint/cpp/code.rb +189 -0
  61. data/lib/adlint/cpp/constexpr.rb +721 -0
  62. data/lib/adlint/cpp/constexpr.y +389 -0
  63. data/lib/adlint/cpp/eval.rb +1012 -0
  64. data/lib/adlint/cpp/lexer.rb +860 -0
  65. data/lib/adlint/cpp/macro.rb +637 -0
  66. data/lib/adlint/cpp/message.rb +992 -0
  67. data/lib/adlint/cpp/phase.rb +176 -0
  68. data/lib/adlint/cpp/scanner.rb +93 -0
  69. data/lib/adlint/cpp/source.rb +169 -0
  70. data/lib/adlint/cpp/subst.rb +300 -0
  71. data/lib/adlint/cpp/syntax.rb +1412 -0
  72. data/lib/adlint/cpp/util.rb +97 -0
  73. data/lib/adlint/cpp.rb +43 -0
  74. data/lib/adlint/driver.rb +147 -0
  75. data/lib/adlint/error.rb +179 -0
  76. data/lib/adlint/lang.rb +97 -0
  77. data/lib/adlint/ld/message.rb +259 -0
  78. data/lib/adlint/ld/metric.rb +57 -0
  79. data/lib/adlint/ld/object.rb +542 -0
  80. data/lib/adlint/ld/phase.rb +193 -0
  81. data/lib/adlint/ld/typedef.rb +109 -0
  82. data/lib/adlint/ld/util.rb +88 -0
  83. data/lib/adlint/ld.rb +37 -0
  84. data/lib/adlint/lexer.rb +293 -0
  85. data/lib/adlint/message.rb +368 -0
  86. data/lib/adlint/metric.rb +805 -0
  87. data/lib/adlint/monitor.rb +144 -0
  88. data/lib/adlint/phase.rb +90 -0
  89. data/lib/adlint/prelude.rb +314 -0
  90. data/lib/adlint/report.rb +617 -0
  91. data/lib/adlint/source.rb +155 -0
  92. data/lib/adlint/symbol.rb +127 -0
  93. data/lib/adlint/token.rb +215 -0
  94. data/lib/adlint/traits.rb +643 -0
  95. data/lib/adlint/util.rb +524 -0
  96. data/lib/adlint/version.rb +71 -0
  97. data/lib/adlint.rb +66 -0
  98. data/share/HEADER +45 -0
  99. data/share/demo/Makefile +110 -0
  100. data/share/demo/ambig_operator/ambig_operator.c +289 -0
  101. data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
  102. data/share/demo/array_range/array_range.c +62 -0
  103. data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
  104. data/share/demo/bad_brace/bad_brace.c +19 -0
  105. data/share/demo/bad_charset/abcde$.h +0 -0
  106. data/share/demo/bad_charset/bad_charset.c +22 -0
  107. data/share/demo/bad_comment/bad_comment.c +3 -0
  108. data/share/demo/bad_const/bad_const.c +19 -0
  109. data/share/demo/bad_conv/bad_conv.c +48 -0
  110. data/share/demo/bad_indent/bad_indent.c +50 -0
  111. data/share/demo/bad_init/bad_init.c +49 -0
  112. data/share/demo/bad_macro/bad_macro.c +97 -0
  113. data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
  114. data/share/demo/call_by_value/call_by_value.c +26 -0
  115. data/share/demo/cross_ref/cross_ref.c +21 -0
  116. data/share/demo/dangling_else/dangling_else.c +20 -0
  117. data/share/demo/dead_code/dead_code.c +237 -0
  118. data/share/demo/deep_nest/deep_nest.c +57 -0
  119. data/share/demo/dense_switch/dense_switch.c +62 -0
  120. data/share/demo/direct_recur/direct_recur.c +15 -0
  121. data/share/demo/div_by_zero/div_by_zero.c +35 -0
  122. data/share/demo/dos_source/dos_source.c +7 -0
  123. data/share/demo/funptr_cast/funptr_cast.c +26 -0
  124. data/share/demo/goto_stmt/goto_stmt.c +19 -0
  125. data/share/demo/id_hiding/id_hiding.c +19 -0
  126. data/share/demo/ill_defined/ill_defined.c +13 -0
  127. data/share/demo/implicit_conv/implicit_conv.c +60 -0
  128. data/share/demo/implicit_int/implicit_int.c +14 -0
  129. data/share/demo/incomplete_type/incomplete_type.c +49 -0
  130. data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
  131. data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
  132. data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
  133. data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
  134. data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
  135. data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
  136. data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
  137. data/share/demo/intro_demo/intro_demo.c +76 -0
  138. data/share/demo/intro_demo/intro_demo.h +12 -0
  139. data/share/demo/intro_demo/useless_header.h +5 -0
  140. data/share/demo/invalid_call/invalid_call.c +32 -0
  141. data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
  142. data/share/demo/line_comment/line_comment.c +12 -0
  143. data/share/demo/local_decl/local_decl.c +9 -0
  144. data/share/demo/logical_trick/logical_trick.c +36 -0
  145. data/share/demo/long_sym/long_sym.c +5 -0
  146. data/share/demo/loop_var/loop_var.c +92 -0
  147. data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
  148. data/share/demo/may_be_null/may_be_null.c +52 -0
  149. data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
  150. data/share/demo/may_be_unset/may_be_unset.c +34 -0
  151. data/share/demo/mmapped_io/mmapped_io.c +23 -0
  152. data/share/demo/multi_break/multi_break.c +33 -0
  153. data/share/demo/multi_decl/multi_decl_1.c +17 -0
  154. data/share/demo/multi_decl/multi_decl_1.h +6 -0
  155. data/share/demo/multi_decl/multi_decl_2.c +13 -0
  156. data/share/demo/multi_decl/multi_decl_2.h +6 -0
  157. data/share/demo/multi_decl/multi_decl_3.c +22 -0
  158. data/share/demo/multi_def/multi_def_1.c +36 -0
  159. data/share/demo/multi_def/multi_def_1.h +6 -0
  160. data/share/demo/multi_def/multi_def_2.c +22 -0
  161. data/share/demo/multi_def/multi_def_2.h +6 -0
  162. data/share/demo/multi_def/multi_def_3.c +6 -0
  163. data/share/demo/multi_typedef/multi_typedef.c +11 -0
  164. data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
  165. data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
  166. data/share/demo/must_be_false/must_be_false.c +53 -0
  167. data/share/demo/must_be_null/must_be_null.c +13 -0
  168. data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
  169. data/share/demo/must_be_true/must_be_true.c +21 -0
  170. data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
  171. data/share/demo/no_void_arg/no_void_arg.c +14 -0
  172. data/share/demo/null_stmt/null_stmt.c +19 -0
  173. data/share/demo/octal_const/octal_const.c +20 -0
  174. data/share/demo/output_by_param/output_by_param.c +17 -0
  175. data/share/demo/overflow/overflow.c +74 -0
  176. data/share/demo/press_release/press_release.c +40 -0
  177. data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
  178. data/share/demo/shift_expr/shift_expr.c +14 -0
  179. data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
  180. data/share/demo/static_paths/static_paths.c +153 -0
  181. data/share/demo/static_vars/static_vars.c +39 -0
  182. data/share/demo/tag_hiding/tag_hiding.c +18 -0
  183. data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
  184. data/share/demo/undefined_macro/undefined_macro.c +17 -0
  185. data/share/demo/uninit_vars/uninit_vars.c +28 -0
  186. data/share/demo/union_type/union_type.c +23 -0
  187. data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
  188. data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
  189. data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
  190. data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
  191. data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
  192. data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
  193. data/share/demo/unreachable/unreachable.c +34 -0
  194. data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
  195. data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
  196. data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
  197. data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
  198. data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
  199. data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
  200. data/share/demo/useless_expr/useless_expr.c +17 -0
  201. data/share/demo/useless_funs/useless_funs_1.c +21 -0
  202. data/share/demo/useless_funs/useless_funs_1.h +8 -0
  203. data/share/demo/useless_funs/useless_funs_2.c +6 -0
  204. data/share/demo/useless_header/useless_header.c +9 -0
  205. data/share/demo/useless_header/useless_header_1.h +12 -0
  206. data/share/demo/useless_header/useless_header_2.h +6 -0
  207. data/share/demo/useless_header/useless_header_3.h +9 -0
  208. data/share/demo/useless_header/useless_header_4.h +3 -0
  209. data/share/demo/useless_vars/useless_vars.c +17 -0
  210. data/share/demo/va_funcall/va_funcall.c +25 -0
  211. data/share/demo/various_fundef/various_fundef.c +36 -0
  212. data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
  213. data/share/demo/wrap_around/wrap_around.c +38 -0
  214. data/share/doc/Makefile +16 -0
  215. data/share/doc/adlint_on_adqua.png +0 -0
  216. data/share/doc/adlint_on_eclipse_en.png +0 -0
  217. data/share/doc/adlint_on_eclipse_ja.png +0 -0
  218. data/share/doc/adlint_on_vim_en.png +0 -0
  219. data/share/doc/adlint_on_vim_ja.png +0 -0
  220. data/share/doc/developers_guide_ja.html +171 -0
  221. data/share/doc/developers_guide_ja.texi +87 -0
  222. data/share/doc/gen_mesg_sections.rb +39 -0
  223. data/share/doc/samples/GNUmakefile +162 -0
  224. data/share/doc/samples/adlint_traits.yml +238 -0
  225. data/share/doc/texinfo.css +22 -0
  226. data/share/doc/users_guide_en.html +39975 -0
  227. data/share/doc/users_guide_en.texi +32640 -0
  228. data/share/doc/users_guide_ja.html +40505 -0
  229. data/share/doc/users_guide_ja.texi +33189 -0
  230. data/share/logo/adlint-110.png +0 -0
  231. data/share/logo/adlint-524.png +0 -0
  232. data/share/logo/adlint.svg +4637 -0
  233. data/share/sample/README +6 -0
  234. data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
  235. data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
  236. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
  237. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
  238. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
  239. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
  240. data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
  241. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
  242. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
  243. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
  244. data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
  245. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
  246. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
  247. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
  248. data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
  249. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
  250. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
  251. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
  252. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
  253. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
  254. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
  255. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
  256. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
  257. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
  258. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
  259. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
  260. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
  261. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
  262. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
  263. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
  264. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
  265. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
  353. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
  354. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
  355. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
  356. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
  357. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
  358. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
  359. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
  360. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
  361. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
  362. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
  363. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
  364. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
  365. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
  366. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
  367. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
  368. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
  369. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
  370. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
  371. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
  372. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
  373. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
  374. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
  375. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
  376. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
  377. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
  378. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
  379. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
  380. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
  381. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
  382. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
  383. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
  384. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
  385. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
  386. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
  387. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
  388. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
  389. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
  390. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
  391. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
  392. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
  393. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
  394. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
  395. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
  396. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
  397. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
  398. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
  399. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
  400. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
  401. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
  402. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
  403. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
  404. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
  405. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
  406. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
  407. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
  408. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
  409. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
  410. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
  411. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
  412. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
  413. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
  414. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
  415. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
  416. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
  417. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
  418. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
  419. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
  420. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
  421. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
  422. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
  423. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
  424. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
  425. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
  426. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
  427. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
  428. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
  429. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
  430. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
  431. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
  432. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
  433. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
  434. data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
  435. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
  436. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
  437. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
  438. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
  439. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
  440. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
  441. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
  442. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
  443. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
  444. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
  445. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
  446. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
  447. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
  448. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
  449. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
  450. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
  451. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
  452. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
  453. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
  454. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
  455. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
  456. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
  457. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
  458. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
  459. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
  460. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
  461. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
  462. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
  463. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
  464. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
  465. metadata +532 -0
@@ -0,0 +1,949 @@
1
+ # Controlling expression of selection-statements and iteration-statements.
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/c/syntax"
33
+ require "adlint/c/object"
34
+ require "adlint/c/mediator"
35
+ require "adlint/c/expr"
36
+ require "adlint/c/conv"
37
+
38
+ module AdLint #:nodoc:
39
+ module C #:nodoc:
40
+
41
+ # == DESCRIPTION
42
+ # === Class structure
43
+ # ControllingExpression
44
+ # |
45
+ # +-> ValueDomainManipulator
46
+ # | <-- ValueDomainNarrower
47
+ # | <-- ValueDomainWidener
48
+ # |
49
+ # +-> ValueDomainNarrowing
50
+ # <-- ValueComparison
51
+ # <-- LogicalAnd
52
+ # <-- LogicalOr
53
+ # <-- StrictObjectDerivation
54
+ # <-- DelayedObjectDerivation
55
+ class ControllingExpression
56
+ def initialize(interpreter, branch)
57
+ @interpreter = interpreter
58
+ @branch = branch
59
+ @manipulators = []
60
+ end
61
+
62
+ def ensure_true_by_narrowing(expression = nil)
63
+ if expression
64
+ new_manip = ValueDomainNarrower.new(@interpreter, expression)
65
+ @manipulators.push(new_manip)
66
+ begin
67
+ if @branch.implicit_condition?
68
+ @interpreter._suppress_notification = true
69
+ end
70
+ new_manip.prepare!
71
+ ensure
72
+ if @branch.implicit_condition?
73
+ @interpreter._suppress_notification = false
74
+ end
75
+ end
76
+ else
77
+ new_manip =
78
+ WithoutExpressionValueDomainNarrower.new(@interpreter, @branch.group)
79
+ end
80
+
81
+ @manipulators.push(new_manip)
82
+ new_manip
83
+ end
84
+
85
+ def ensure_true_by_widening(expression = nil)
86
+ if expression
87
+ new_manip = ValueDomainWidener.new(@interpreter, expression)
88
+ begin
89
+ if @branch.implicit_condition?
90
+ @interpreter._suppress_notification = true
91
+ end
92
+ new_manip.prepare!
93
+ ensure
94
+ if @branch.implicit_condition?
95
+ @interpreter._suppress_notification = false
96
+ end
97
+ end
98
+ else
99
+ new_manip =
100
+ WithoutExpressionValueDomainWidener.new(@interpreter, @branch.group)
101
+ end
102
+
103
+ @manipulators.push(new_manip)
104
+ new_manip
105
+ end
106
+
107
+ def undo(path_terminated)
108
+ @manipulators.each { |manip| manip.rollback! } if path_terminated
109
+ end
110
+
111
+ def affected_variables
112
+ @manipulators.map { |manip| manip.affected_variables }.flatten.uniq
113
+ end
114
+
115
+ def save_affected_variables
116
+ @manipulators.each { |manip| manip.save! }
117
+ end
118
+
119
+ def restore_affected_variables
120
+ @manipulators.each { |manip| manip.restore! }
121
+ end
122
+ end
123
+
124
+ class ValueDomainManipulator < SyntaxTreeVisitor
125
+ include InterpreterMediator
126
+ include NotifierMediator
127
+ include Conversion
128
+ include ExpressionUtil
129
+ include MonitorUtil
130
+
131
+ def initialize(interpreter, expression)
132
+ @interpreter = interpreter
133
+ @expression = expression
134
+ @affected_variables = []
135
+ @narrowing = nil
136
+ @value_memory = nil
137
+ end
138
+
139
+ attr_reader :interpreter
140
+ attr_reader :affected_variables
141
+
142
+ def prepare!
143
+ if @expression
144
+ @narrowing = @expression.accept(self)
145
+ @narrowing.execute!
146
+ end
147
+ end
148
+
149
+ def commit!
150
+ if @narrowing
151
+ @narrowing.ensure_result_equal_to(ScalarValue.of_true)
152
+ end
153
+
154
+ commit_changes(@narrowing)
155
+
156
+ if @narrowing
157
+ @affected_variables = @narrowing.narrowed_values.each_key.to_a
158
+ @narrowing = nil
159
+ end
160
+ end
161
+
162
+ def rollback!
163
+ # NOTE: Rollback narrowed version to cut out the value-domain to enter
164
+ # the current branch.
165
+ @affected_variables.each { |variable| variable.value.rollback! }
166
+ end
167
+
168
+ def save!
169
+ @value_memory = {}
170
+ @affected_variables.each do |variable|
171
+ @value_memory[variable] = variable.value.to_single_value.dup
172
+ end
173
+ end
174
+
175
+ def restore!
176
+ if @value_memory
177
+ @value_memory.each do |variable, saved_value|
178
+ variable.assign!(saved_value)
179
+ end
180
+ @value_memory = nil
181
+ end
182
+ end
183
+
184
+ def self.def_strict_object_derivation(method_name)
185
+ class_eval <<-EOS
186
+ define_method("#{method_name}") do |*args|
187
+ StrictObjectDerivation.new(self, args.first)
188
+ end
189
+ EOS
190
+ end
191
+ private_class_method :def_strict_object_derivation
192
+
193
+ def_strict_object_derivation :visit_error_expression
194
+ def_strict_object_derivation :visit_object_specifier
195
+ def_strict_object_derivation :visit_constant_specifier
196
+ def_strict_object_derivation :visit_string_literal_specifier
197
+ def_strict_object_derivation :visit_null_constant_specifier
198
+
199
+ def visit_array_subscript_expression(node)
200
+ checkpoint(node.location)
201
+
202
+ base_narrowing = node.expression.accept(self)
203
+ subscript_narrowing = node.array_subscript.accept(self)
204
+
205
+ DelayedObjectDerivation.new(self, node,
206
+ base_narrowing, subscript_narrowing) do
207
+ checkpoint(node.location)
208
+
209
+ base_narrowing.execute!
210
+ subscript_narrowing.execute!
211
+
212
+ execute_array_subscript_expression(node, base_narrowing.result,
213
+ subscript_narrowing.result)
214
+ end
215
+ end
216
+
217
+ def visit_function_call_expression(node)
218
+ checkpoint(node.location)
219
+
220
+ object_narrowing = node.expression.accept(self)
221
+ arg_narrowings = node.argument_expressions.map { |expr|
222
+ expr.accept(self)
223
+ }
224
+
225
+ DelayedObjectDerivation.new(self, node,
226
+ object_narrowing, *arg_narrowings) do
227
+ checkpoint(node.location)
228
+
229
+ function_calling_context { object_narrowing.execute! }
230
+ args = arg_narrowings.map { |narrowing|
231
+ narrowing.execute!; [narrowing.result, narrowing.node]
232
+ }
233
+
234
+ execute_function_call_expression(node, object_narrowing.result, args)
235
+ end
236
+ end
237
+
238
+ def visit_member_access_by_value_expression(node)
239
+ checkpoint(node.location)
240
+
241
+ object_narrowing = node.expression.accept(self)
242
+
243
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
244
+ checkpoint(node.location)
245
+
246
+ object_narrowing.execute!
247
+
248
+ execute_member_access_by_value_expression(
249
+ node, object_narrowing.result)
250
+ end
251
+ end
252
+
253
+ def visit_member_access_by_pointer_expression(node)
254
+ checkpoint(node.location)
255
+
256
+ object_narrowing = node.expression.accept(self)
257
+
258
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
259
+ checkpoint(node.location)
260
+
261
+ object_narrowing.execute!
262
+
263
+ execute_member_access_by_pointer_expression(
264
+ node, object_narrowing.result)
265
+ end
266
+ end
267
+
268
+ def_strict_object_derivation :visit_bit_access_by_value_expression
269
+ def_strict_object_derivation :visit_bit_access_by_pointer_expression
270
+
271
+ def visit_postfix_increment_expression(node)
272
+ checkpoint(node.location)
273
+
274
+ object_narrowing = node.operand.accept(self)
275
+
276
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
277
+ checkpoint(node.location)
278
+
279
+ variable_reassigning_context { object_narrowing.execute! }
280
+
281
+ execute_postfix_increment_expression(node, object_narrowing.result)
282
+ end
283
+ end
284
+
285
+ def visit_postfix_decrement_expression(node)
286
+ checkpoint(node.location)
287
+
288
+ object_narrowing = node.operand.accept(self)
289
+
290
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
291
+ checkpoint(node.location)
292
+
293
+ variable_reassigning_context { object_narrowing.execute! }
294
+
295
+ execute_postfix_decrement_expression(node, object_narrowing.result)
296
+ end
297
+ end
298
+
299
+ def_strict_object_derivation :visit_compound_literal_expression
300
+
301
+ def visit_prefix_increment_expression(node)
302
+ checkpoint(node.location)
303
+
304
+ object_narrowing = node.operand.accept(self)
305
+
306
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
307
+ checkpoint(node.location)
308
+
309
+ variable_reassigning_context { object_narrowing.execute! }
310
+
311
+ execute_prefix_increment_expression(node, object_narrowing.result)
312
+ end
313
+ end
314
+
315
+ def visit_prefix_decrement_expression(node)
316
+ checkpoint(node.location)
317
+
318
+ object_narrowing = node.operand.accept(self)
319
+
320
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
321
+ checkpoint(node.location)
322
+
323
+ variable_reassigning_context { object_narrowing.execute! }
324
+
325
+ execute_prefix_decrement_expression(node, object_narrowing.result)
326
+ end
327
+ end
328
+
329
+ def_strict_object_derivation :visit_address_expression
330
+
331
+ def visit_indirection_expression(node)
332
+ checkpoint(node.location)
333
+
334
+ object_narrowing = node.operand.accept(self)
335
+
336
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
337
+ checkpoint(node.location)
338
+
339
+ object_narrowing.execute!
340
+
341
+ execute_indirection_expression(node, object_narrowing.result)
342
+ end
343
+ end
344
+
345
+ def visit_unary_arithmetic_expression(node)
346
+ checkpoint(node.location)
347
+
348
+ object_narrowing = node.operand.accept(self)
349
+
350
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
351
+ checkpoint(node.location)
352
+
353
+ object_narrowing.execute!
354
+
355
+ execute_unary_arithmetic_expression(node, object_narrowing.result)
356
+ end
357
+ end
358
+
359
+ def_strict_object_derivation :visit_sizeof_expression
360
+ def_strict_object_derivation :visit_sizeof_type_expression
361
+ def_strict_object_derivation :visit_alignof_expression
362
+ def_strict_object_derivation :visit_alignof_type_expression
363
+
364
+ def visit_cast_expression(node)
365
+ checkpoint(node.location)
366
+
367
+ object_narrowing = node.operand.accept(self)
368
+
369
+ DelayedObjectDerivation.new(self, node, object_narrowing) do
370
+ checkpoint(node.location)
371
+
372
+ object_narrowing.execute!
373
+
374
+ execute_cast_expression(node, object_narrowing.result)
375
+ end
376
+ end
377
+
378
+ def visit_multiplicative_expression(node)
379
+ checkpoint(node.location)
380
+
381
+ lhs_narrowing = node.lhs_operand.accept(self)
382
+ rhs_narrowing = node.rhs_operand.accept(self)
383
+
384
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
385
+ checkpoint(node.location)
386
+
387
+ lhs_narrowing.execute!
388
+ rhs_narrowing.execute!
389
+
390
+ execute_multiplicative_expression(
391
+ node, lhs_narrowing.result, rhs_narrowing.result)
392
+ end
393
+ end
394
+
395
+ def visit_additive_expression(node)
396
+ checkpoint(node.location)
397
+
398
+ lhs_narrowing = node.lhs_operand.accept(self)
399
+ rhs_narrowing = node.rhs_operand.accept(self)
400
+
401
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
402
+ checkpoint(node.location)
403
+
404
+ lhs_narrowing.execute!
405
+ rhs_narrowing.execute!
406
+
407
+ execute_additive_expression(
408
+ node, lhs_narrowing.result, rhs_narrowing.result)
409
+ end
410
+ end
411
+
412
+ def visit_shift_expression(node)
413
+ checkpoint(node.location)
414
+
415
+ lhs_narrowing = node.lhs_operand.accept(self)
416
+ rhs_narrowing = node.rhs_operand.accept(self)
417
+
418
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
419
+ checkpoint(node.location)
420
+
421
+ lhs_narrowing.execute!
422
+ rhs_narrowing.execute!
423
+
424
+ execute_shift_expression(
425
+ node, lhs_narrowing.result, rhs_narrowing.result)
426
+ end
427
+ end
428
+
429
+ def visit_relational_expression(node)
430
+ checkpoint(node.location)
431
+
432
+ lhs_narrowing = node.lhs_operand.accept(self)
433
+ rhs_narrowing = node.rhs_operand.accept(self)
434
+
435
+ ValueComparison.new(self, node, lhs_narrowing, rhs_narrowing)
436
+ end
437
+
438
+ def visit_equality_expression(node)
439
+ checkpoint(node.location)
440
+
441
+ lhs_narrowing = node.lhs_operand.accept(self)
442
+ rhs_narrowing = node.rhs_operand.accept(self)
443
+
444
+ ValueComparison.new(self, node, lhs_narrowing, rhs_narrowing)
445
+ end
446
+
447
+ def visit_and_expression(node)
448
+ checkpoint(node.location)
449
+
450
+ lhs_narrowing = node.lhs_operand.accept(self)
451
+ rhs_narrowing = node.rhs_operand.accept(self)
452
+
453
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
454
+ checkpoint(node.location)
455
+
456
+ lhs_narrowing.execute!
457
+ rhs_narrowing.execute!
458
+
459
+ execute_and_expression(node,
460
+ lhs_narrowing.result, rhs_narrowing.result)
461
+ end
462
+ end
463
+
464
+ def visit_exclusive_or_expression(node)
465
+ checkpoint(node.location)
466
+
467
+ lhs_narrowing = node.lhs_operand.accept(self)
468
+ rhs_narrowing = node.rhs_operand.accept(self)
469
+
470
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
471
+ checkpoint(node.location)
472
+
473
+ lhs_narrowing.execute!
474
+ rhs_narrowing.execute!
475
+
476
+ execute_exclusive_or_expression(
477
+ node, lhs_narrowing.result, rhs_narrowing.result)
478
+ end
479
+ end
480
+
481
+ def visit_inclusive_or_expression(node)
482
+ checkpoint(node.location)
483
+
484
+ lhs_narrowing = node.lhs_operand.accept(self)
485
+ rhs_narrowing = node.rhs_operand.accept(self)
486
+
487
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
488
+ checkpoint(node.location)
489
+
490
+ lhs_narrowing.execute!
491
+ rhs_narrowing.execute!
492
+
493
+ execute_inclusive_or_expression(
494
+ node, lhs_narrowing.result, rhs_narrowing.result)
495
+ end
496
+ end
497
+
498
+ def visit_logical_and_expression(node)
499
+ checkpoint(node.location)
500
+
501
+ lhs_narrowing = node.lhs_operand.accept(self)
502
+ rhs_narrowing = node.rhs_operand.accept(self)
503
+
504
+ LogicalAnd.new(self, node, lhs_narrowing, rhs_narrowing)
505
+ end
506
+
507
+ def visit_logical_or_expression(node)
508
+ checkpoint(node.location)
509
+
510
+ lhs_narrowing = node.lhs_operand.accept(self)
511
+ rhs_narrowing = node.rhs_operand.accept(self)
512
+
513
+ LogicalOr.new(self, node, lhs_narrowing, rhs_narrowing)
514
+ end
515
+
516
+ def_strict_object_derivation :visit_conditional_expression
517
+
518
+ def visit_simple_assignment_expression(node)
519
+ checkpoint(node.location)
520
+
521
+ lhs_narrowing = node.lhs_operand.accept(self)
522
+ rhs_narrowing = node.rhs_operand.accept(self)
523
+
524
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
525
+ checkpoint(node.location)
526
+
527
+ variable_reassigning_context { lhs_narrowing.execute! }
528
+ rhs_narrowing.execute!
529
+
530
+ execute_simple_assignment_expression(
531
+ node, lhs_narrowing.result, rhs_narrowing.result)
532
+ end
533
+ end
534
+
535
+ def visit_compound_assignment_expression(node)
536
+ checkpoint(node.location)
537
+
538
+ lhs_narrowing = node.lhs_operand.accept(self)
539
+ rhs_narrowing = node.rhs_operand.accept(self)
540
+
541
+ DelayedObjectDerivation.new(self, node, lhs_narrowing, rhs_narrowing) do
542
+ checkpoint(node.location)
543
+
544
+ variable_reassigning_context { lhs_narrowing.execute! }
545
+ rhs_narrowing.execute!
546
+
547
+ execute_compound_assignment_expression(
548
+ node, lhs_narrowing.result, rhs_narrowing.result)
549
+ end
550
+ end
551
+
552
+ def visit_comma_separated_expression(node)
553
+ checkpoint(node.location)
554
+
555
+ object_narrowings = node.expressions.map { |expr| expr.accept(self) }
556
+
557
+ DelayedObjectDerivation.new(self, node, *object_narrowings) do
558
+ checkpoint(node.location)
559
+
560
+ object_narrowings.map { |narrowing|
561
+ narrowing.execute!
562
+ narrowing.result
563
+ }.last
564
+ end
565
+ end
566
+
567
+ private
568
+ def commit_changes(narrowing)
569
+ subclass_responsibility
570
+ end
571
+ end
572
+
573
+ class ValueDomainNarrower < ValueDomainManipulator
574
+ private
575
+ def commit_changes(narrowing)
576
+ narrowing.narrowed_values.each do |variable, narrowed_value|
577
+ variable.narrow_value_domain!(:==, narrowed_value)
578
+ end
579
+ end
580
+ end
581
+
582
+ class ValueDomainWidener < ValueDomainManipulator
583
+ private
584
+ def commit_changes(narrowing)
585
+ narrowing.narrowed_values.each do |variable, narrowed_value|
586
+ variable.widen_value_domain!(:==, narrowed_value)
587
+ end
588
+ end
589
+ end
590
+
591
+ class WithoutExpressionValueDomainNarrower < ValueDomainManipulator
592
+ def initialize(interpreter, branch_group)
593
+ super(interpreter, nil)
594
+ @branch_group = branch_group
595
+ end
596
+
597
+ def prepare!
598
+ raise TypeError, "no preparation without expression."
599
+ end
600
+
601
+ private
602
+ def commit_changes(narrowing)
603
+ @branch_group.all_condition_variables.each do |variable|
604
+ variable.narrow_value_domain!(:==, variable.type.arbitrary_value)
605
+ end
606
+ true
607
+ end
608
+ end
609
+
610
+ class WithoutExpressionValueDomainWidener < ValueDomainManipulator
611
+ def initialize(interpreter, branch_group)
612
+ super(interpreter, nil)
613
+ @branch_group = branch_group
614
+ end
615
+
616
+ def prepare!
617
+ raise TypeError, "no preparation without expression."
618
+ end
619
+
620
+ private
621
+ def commit_changes(narrowing)
622
+ @branch_group.all_condition_variables.each do |variable|
623
+ variable.widen_value_domain!(:==, variable.type.arbitrary_value)
624
+ end
625
+ true
626
+ end
627
+ end
628
+
629
+ class ValueDomainNarrowing
630
+ include InterpreterMediator
631
+ include NotifierMediator
632
+ include Conversion
633
+
634
+ def initialize(value_domain_manipulator, node, *children)
635
+ @manipulator = value_domain_manipulator
636
+ @node = node
637
+ @children = children
638
+ @original_values = {}
639
+ @narrowed_values = {}
640
+ @result = nil
641
+ end
642
+
643
+ attr_reader :node
644
+ attr_reader :narrowed_values
645
+ attr_reader :result
646
+
647
+ def load_original_values!(narrowing)
648
+ @original_values = narrowing.narrowed_values
649
+ @children.each { |child| child.load_original_values!(narrowing) }
650
+ end
651
+
652
+ def execute!
653
+ @result = do_narrowing
654
+ @children.each do |narrowing|
655
+ @narrowed_values = narrowing.narrowed_values.merge(@narrowed_values)
656
+ end
657
+ end
658
+
659
+ def ensure_result_equal_to(value)
660
+ if @result.variable? && @result.designated_by_lvalue?
661
+ if @result.value.scalar? && value.scalar?
662
+ ensure_relation(@result, :==, value)
663
+ end
664
+ end
665
+ end
666
+
667
+ protected
668
+ attr_reader :original_values
669
+
670
+ private
671
+ def do_narrowing
672
+ subclass_responsibility
673
+ end
674
+
675
+ def do_logical_arithmetic_conversion(node, lhs_variable, rhs_variable)
676
+ lhs_result, rhs_result =
677
+ do_usual_arithmetic_conversion(lhs_variable, rhs_variable)
678
+
679
+ unless lhs_variable == lhs_result
680
+ notify_implicit_conv_performed(node.lhs_operand,
681
+ lhs_variable, lhs_result)
682
+ end
683
+
684
+ unless rhs_variable == rhs_result
685
+ notify_implicit_conv_performed(node.rhs_operand,
686
+ rhs_variable, rhs_result)
687
+ end
688
+
689
+ return lhs_result, rhs_result
690
+ end
691
+
692
+ def ensure_relation(variable, operator_symbol, value)
693
+ target_value = save_original_value(variable).dup
694
+ target_value.narrow_domain!(operator_symbol, value)
695
+ update_narrowed_value(variable, target_value)
696
+ end
697
+
698
+ def save_original_value(variable)
699
+ @original_values[variable.to_named_variable] ||= variable.value.dup
700
+ end
701
+
702
+ def original_value_of(variable)
703
+ @original_values[variable.to_named_variable]
704
+ end
705
+
706
+ def update_narrowed_value(variable, new_value)
707
+ @narrowed_values[variable.to_named_variable] = new_value
708
+ end
709
+
710
+ def narrowing_merge!(lhs_narrowing, rhs_narrowing)
711
+ lhs_values = lhs_narrowing.narrowed_values
712
+ rhs_values = rhs_narrowing.narrowed_values
713
+
714
+ @narrowed_values = lhs_values.merge(rhs_values) { |key, lhs_val, rhs_val|
715
+ result = lhs_val.dup
716
+ result.narrow_domain!(:==, rhs_val)
717
+ result
718
+ }
719
+ end
720
+
721
+ def widening_merge!(lhs_narrowing, rhs_narrowing)
722
+ lhs_values = lhs_narrowing.narrowed_values
723
+ rhs_values = rhs_narrowing.narrowed_values
724
+
725
+ @narrowed_values = lhs_values.merge(rhs_values) { |key, lhs_val, rhs_val|
726
+ result = lhs_val.dup
727
+ result.widen_domain!(:==, rhs_val)
728
+ result
729
+ }
730
+ end
731
+
732
+ def interpreter
733
+ # NOTE: This is private attr_reader for InterpreterMediator.
734
+ # This attribute is read via a normal method to suppress
735
+ # `private attribute?' warning.
736
+ @manipulator.interpreter
737
+ end
738
+ end
739
+
740
+ class ValueComparison < ValueDomainNarrowing
741
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
742
+ super
743
+ @operator_symbol = node.operator.type.to_sym
744
+ @lhs_narrowing = lhs_narrowing
745
+ @rhs_narrowing = rhs_narrowing
746
+ end
747
+
748
+ private
749
+ def do_narrowing
750
+ @lhs_narrowing.execute!
751
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
752
+
753
+ @rhs_narrowing.execute!
754
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
755
+
756
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
757
+ return temporary_variable(int_type)
758
+ end
759
+
760
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
761
+ return temporary_variable(int_type)
762
+ end
763
+
764
+ lhs_converted, rhs_converted =
765
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
766
+
767
+ case @operator_symbol
768
+ when :==
769
+ result = temporary_variable(int_type,
770
+ lhs_converted.value == rhs_converted.value)
771
+ when :!=
772
+ result = temporary_variable(int_type,
773
+ lhs_converted.value != rhs_converted.value)
774
+ when :<
775
+ result = temporary_variable(int_type,
776
+ lhs_converted.value < rhs_converted.value)
777
+ when :>
778
+ result = temporary_variable(int_type,
779
+ lhs_converted.value > rhs_converted.value)
780
+ when :<=
781
+ result = temporary_variable(int_type,
782
+ lhs_converted.value <= rhs_converted.value)
783
+ when :>=
784
+ result = temporary_variable(int_type,
785
+ lhs_converted.value >= rhs_converted.value)
786
+ else
787
+ # NOTREACHED
788
+ end
789
+
790
+ notify_equality_expr_evaled(@node, lhs_converted, rhs_converted, result)
791
+
792
+ case
793
+ when lhs_converted.designated_by_lvalue?
794
+ ensure_relation(lhs_converted, @operator_symbol, rhs_converted.value)
795
+ when rhs_converted.designated_by_lvalue?
796
+ ensure_relation(rhs_converted, @operator_symbol, lhs_converted.value)
797
+ else
798
+ # NOTE: Domain of the rvalue should not be narrowed.
799
+ end
800
+
801
+ result
802
+ end
803
+ end
804
+
805
+ class LogicalAnd < ValueDomainNarrowing
806
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
807
+ super
808
+ @lhs_narrowing = lhs_narrowing
809
+ @rhs_narrowing = rhs_narrowing
810
+ end
811
+
812
+ private
813
+ def do_narrowing
814
+ @lhs_narrowing.execute!
815
+ @lhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
816
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
817
+
818
+ # TODO: Must look about the short-circuit evaluation.
819
+ @rhs_narrowing.load_original_values!(@lhs_narrowing)
820
+ @rhs_narrowing.execute!
821
+ @rhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
822
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
823
+
824
+ narrowing_merge!(@lhs_narrowing, @rhs_narrowing)
825
+
826
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
827
+ return temporary_variable(int_type)
828
+ end
829
+
830
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
831
+ return temporary_variable(int_type)
832
+ end
833
+
834
+ lhs_converted, rhs_converted =
835
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
836
+
837
+ result = temporary_variable(
838
+ int_type, lhs_converted.value.logical_and(rhs_converted.value))
839
+ notify_logical_and_expr_evaled(@node,
840
+ lhs_converted, rhs_converted, result)
841
+ result
842
+ end
843
+ end
844
+
845
+ class LogicalOr < ValueDomainNarrowing
846
+ def initialize(value_domain_manip, node, lhs_narrowing, rhs_narrowing)
847
+ super
848
+ @lhs_narrowing = lhs_narrowing
849
+ @rhs_narrowing = rhs_narrowing
850
+ end
851
+
852
+ private
853
+ def do_narrowing
854
+ @lhs_narrowing.execute!
855
+ @lhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
856
+ lhs_variable = object_to_variable(@lhs_narrowing.result)
857
+
858
+ # TODO: Must look about the short-circuit evaluation.
859
+ # FIXME: Base value of the RHS narrowing should be updated to ensure that
860
+ # the LHS condition is false.
861
+ @rhs_narrowing.execute!
862
+ @rhs_narrowing.ensure_result_equal_to(ScalarValue.of_true)
863
+ rhs_variable = object_to_variable(@rhs_narrowing.result)
864
+
865
+ widening_merge!(@lhs_narrowing, @rhs_narrowing)
866
+
867
+ unless lhs_variable.type.scalar? && rhs_variable.type.scalar?
868
+ return temporary_variable(int_type)
869
+ end
870
+
871
+ unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
872
+ return temporary_variable(int_type)
873
+ end
874
+
875
+ lhs_converted, rhs_converted =
876
+ do_logical_arithmetic_conversion(@node, lhs_variable, rhs_variable)
877
+
878
+ result = temporary_variable(
879
+ int_type, lhs_converted.value.logical_or(rhs_converted.value))
880
+ notify_logical_or_expr_evaled(@node,
881
+ lhs_converted, rhs_converted, result)
882
+ result
883
+ end
884
+ end
885
+
886
+ class StrictObjectDerivation < ValueDomainNarrowing
887
+ def initialize(value_domain_manipulator, node)
888
+ super(value_domain_manipulator, node)
889
+ @object = interpret(node)
890
+ end
891
+
892
+ private
893
+ def do_narrowing
894
+ if @object.variable? && @object.named?
895
+ if original_value = original_value_of(@object)
896
+ @object = PhantomVariable.new(@object, original_value)
897
+ end
898
+ end
899
+ @object
900
+ end
901
+ end
902
+
903
+ class DelayedObjectDerivation < ValueDomainNarrowing
904
+ def initialize(value_domain_manipulator, node, *children, &block)
905
+ super(value_domain_manipulator, node, *children)
906
+ @block = block
907
+ end
908
+
909
+ private
910
+ def do_narrowing
911
+ @block.call
912
+ end
913
+ end
914
+
915
+ class PhantomVariable < AliasVariable
916
+ def initialize(named_variable, phantom_value = nil)
917
+ super(named_variable)
918
+
919
+ @base_variable = named_variable
920
+ @phantom_value = phantom_value ?
921
+ phantom_value : named_variable.memory.read_modifiable.dup
922
+ end
923
+
924
+ def value
925
+ @phantom_value
926
+ end
927
+
928
+ def assign!(value)
929
+ @phantom_value = value
930
+ end
931
+
932
+ def to_named_variable
933
+ @base_variable.to_named_variable
934
+ end
935
+
936
+ def pretty_print(pp)
937
+ Summary.new(object_id, name, type, @phantom_value).pretty_print(pp)
938
+ end
939
+
940
+ Summary = Struct.new(:object_id, :name, :type, :value)
941
+
942
+ private
943
+ def modifiable_value
944
+ @phantom_value
945
+ end
946
+ end
947
+
948
+ end
949
+ end