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