adlint 1.4.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/ChangeLog +413 -5
  2. data/MANIFEST +6 -0
  3. data/NEWS +43 -4
  4. data/etc/mesg.d/en_US/messages.yml +1 -1
  5. data/etc/mesg.d/ja_JP/messages.yml +1 -1
  6. data/lib/adlint/c.rb +1 -0
  7. data/lib/adlint/c/enum.rb +52 -0
  8. data/lib/adlint/c/expr.rb +43 -102
  9. data/lib/adlint/c/interp.rb +1 -1
  10. data/lib/adlint/c/mediator.rb +1 -0
  11. data/lib/adlint/c/message.rb +831 -49
  12. data/lib/adlint/c/message_shima.rb +236 -0
  13. data/lib/adlint/c/metric.rb +9 -0
  14. data/lib/adlint/c/object.rb +37 -32
  15. data/lib/adlint/c/parser.rb +7 -7
  16. data/lib/adlint/c/parser.y +7 -7
  17. data/lib/adlint/c/phase.rb +21 -0
  18. data/lib/adlint/c/syntax.rb +11 -4
  19. data/lib/adlint/c/type.rb +1 -1
  20. data/lib/adlint/cpp.rb +1 -0
  21. data/lib/adlint/cpp/asm.rb +73 -0
  22. data/lib/adlint/cpp/message.rb +13 -0
  23. data/lib/adlint/cpp/message_shima.rb +36 -0
  24. data/lib/adlint/cpp/phase.rb +3 -0
  25. data/lib/adlint/cpp/source.rb +9 -0
  26. data/lib/adlint/version.rb +3 -3
  27. data/share/demo/Makefile +4 -0
  28. data/share/demo/bad_conv/bad_conv.c +12 -0
  29. data/share/demo/bad_enum/bad_enum.c +48 -2
  30. data/share/demo/bad_label/bad_label.c +26 -0
  31. data/share/demo/bad_macro/bad_macro.c +3 -0
  32. data/share/demo/implicit_conv/implicit_conv.c +1 -0
  33. data/share/demo/inline_asm/inline_asm.c +18 -0
  34. data/share/demo/invalid_call/invalid_call.c +5 -0
  35. data/share/demo/multi_decl/multi_decl_1.c +30 -0
  36. data/share/demo/overflow/overflow.c +3 -3
  37. data/share/demo/redundant_select/redundant_select.c +25 -0
  38. data/share/demo/reserved_ident/reserved_ident.c +98 -0
  39. data/share/doc/developers_guide_ja.html +3 -3
  40. data/share/doc/developers_guide_ja.texi +1 -1
  41. data/share/doc/users_guide_en.html +234 -126
  42. data/share/doc/users_guide_en.texi +207 -98
  43. data/share/doc/users_guide_ja.html +247 -156
  44. data/share/doc/users_guide_ja.texi +221 -130
  45. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +1 -1
  46. metadata +8 -2
@@ -551,7 +551,9 @@ module C #:nodoc:
551
551
  W0570.new(context),
552
552
  W0571.new(context),
553
553
  W0572.new(context),
554
+ W0573.new(context),
554
555
  W0578.new(context),
556
+ W0579.new(context),
555
557
  W0580.new(context),
556
558
  W0581.new(context),
557
559
  W0582.new(context),
@@ -614,6 +616,8 @@ module C #:nodoc:
614
616
  W0682.new(context),
615
617
  W0683.new(context),
616
618
  W0684.new(context),
619
+ W0685.new(context),
620
+ W0686.new(context),
617
621
  W0698.new(context),
618
622
  W0699.new(context),
619
623
  W0703.new(context),
@@ -670,8 +674,12 @@ module C #:nodoc:
670
674
  W0777.new(context),
671
675
  W0778.new(context),
672
676
  W0779.new(context),
677
+ W0781.new(context),
673
678
  W0785.new(context),
674
679
  W0786.new(context),
680
+ W0787.new(context),
681
+ W0788.new(context),
682
+ W0789.new(context),
675
683
  W0790.new(context),
676
684
  W0795.new(context),
677
685
  W0796.new(context),
@@ -680,6 +688,7 @@ module C #:nodoc:
680
688
  W0799.new(context),
681
689
  W0800.new(context),
682
690
  W0801.new(context),
691
+ W0809.new(context),
683
692
  W0810.new(context),
684
693
  W0827.new(context),
685
694
  W0828.new(context),
@@ -690,6 +699,7 @@ module C #:nodoc:
690
699
  W1027.new(context),
691
700
  W1028.new(context),
692
701
  W1029.new(context),
702
+ W1030.new(context),
693
703
  W1031.new(context),
694
704
  W1032.new(context),
695
705
  W1033.new(context),
@@ -698,6 +708,17 @@ module C #:nodoc:
698
708
  W1050.new(context),
699
709
  W1051.new(context),
700
710
  W1052.new(context),
711
+ W1053.new(context),
712
+ W1054.new(context),
713
+ W1055.new(context),
714
+ W1056.new(context),
715
+ W1057.new(context),
716
+ W1058.new(context),
717
+ W1059.new(context),
718
+ W1060.new(context),
719
+ W1061.new(context),
720
+ W1062.new(context),
721
+ W1063.new(context),
701
722
  W1064.new(context),
702
723
  W1065.new(context),
703
724
  W9001.new(context)
@@ -31,6 +31,7 @@
31
31
 
32
32
  require "adlint/symbol"
33
33
  require "adlint/util"
34
+ require "adlint/c/enum"
34
35
  require "adlint/c/seqp"
35
36
 
36
37
  module AdLint #:nodoc:
@@ -411,10 +412,16 @@ module C #:nodoc:
411
412
  subclass_responsibility
412
413
  end
413
414
 
414
- def constant?
415
- visitor = ObjectSpecifierCollector.new
416
- accept(visitor)
417
- visitor.object_specifiers.empty?
415
+ def constant?(enumerator_table)
416
+ object_specifiers.all? { |object_specifier|
417
+ enumerator_table.lookup(object_specifier.identifier.value)
418
+ }
419
+ end
420
+
421
+ def object_specifiers
422
+ ObjectSpecifierCollector.new.tap { |collector|
423
+ self.accept(collector)
424
+ }.object_specifiers
418
425
  end
419
426
 
420
427
  def to_s
data/lib/adlint/c/type.rb CHANGED
@@ -7558,7 +7558,7 @@ module C #:nodoc:
7558
7558
  end
7559
7559
  size ||= 0
7560
7560
  else
7561
- if size_expression.constant?
7561
+ if size_expression.object_specifiers.empty?
7562
7562
  object = Interpreter.new(@type_table).execute(size_expression)
7563
7563
  if object.variable? && object.value.scalar?
7564
7564
  size = object.value.unique_sample
data/lib/adlint/cpp.rb CHANGED
@@ -29,6 +29,7 @@
29
29
  #
30
30
  #++
31
31
 
32
+ require "adlint/cpp/asm"
32
33
  require "adlint/cpp/code"
33
34
  require "adlint/cpp/eval"
34
35
  require "adlint/cpp/constexpr"
@@ -0,0 +1,73 @@
1
+ # Inline assembly notations.
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/cpp/subst"
33
+
34
+ module AdLint #:nodoc:
35
+ module Cpp #:nodoc:
36
+
37
+ module InlineAssemblyDefinition
38
+ def create_inline_assembly_substitutions(source)
39
+ [create_cxx_asm_definition(source)] +
40
+ create_extended_asm_definitions(source)
41
+ end
42
+
43
+ def create_cxx_asm_definition(source)
44
+ CodeSubstitution.new("asm(__adlint__any);", "").tap do |subst|
45
+ subst.on_substitution += lambda { |location, matched|
46
+ source.on_inline_assembly.invoke(location, matched)
47
+ }
48
+ end
49
+ end
50
+
51
+ def create_extended_asm_definitions(source)
52
+ [
53
+ "__asm(__adlint__any);",
54
+ "asm { __adlint__any }",
55
+ "__asm { __adlint__any }",
56
+ "__asm__(__adlint__any);",
57
+ "__asm__ volatile (__adlint__any);",
58
+ "__asm__ __volatile__ (__adlint__any);",
59
+ "asm(__adlint__any);",
60
+ "asm volatile (__adlint__any);",
61
+ "asm __volatile__ (__adlint__any);"
62
+ ].map do |pattern|
63
+ CodeSubstitution.new(pattern, "").tap { |subst|
64
+ subst.on_substitution += lambda { |location, matched|
65
+ source.on_inline_assembly.invoke(location, matched)
66
+ }
67
+ }
68
+ end
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -771,6 +771,19 @@ module Cpp #:nodoc:
771
771
  end
772
772
  end
773
773
 
774
+ class W0541 < PassiveMessageDetection
775
+ # NOTE: W0541 may be duplicative when the same header which has the token
776
+ # sequence of the compiler specific extension is included twice or
777
+ # more.
778
+ ensure_uniqueness_of :W0541
779
+
780
+ def initialize(context)
781
+ super
782
+ context[:c_source].on_inline_assembly +=
783
+ lambda { |location, matched| W(:W0541, location) }
784
+ end
785
+ end
786
+
774
787
  class W0549 < PassiveMessageDetection
775
788
  # NOTE: W0549 may be duplicative when the same header which causes this
776
789
  # warning is included twice or more.
@@ -147,5 +147,41 @@ module Cpp #:nodoc:
147
147
  end
148
148
  end
149
149
 
150
+ class W0807 < W0687
151
+ # NOTE: W0807 may be duplicative when the same header which causes this
152
+ # warning is included twice or more.
153
+ ensure_uniqueness_of :W0807
154
+
155
+ private
156
+ def check(undef_line, macro)
157
+ if macro.kind_of?(SpecialMacro)
158
+ identifier = undef_line.identifier
159
+ W(:W0807, identifier.location, identifier.value)
160
+ end
161
+ end
162
+ end
163
+
164
+ class W0808 < PassiveMessageDetection
165
+ # NOTE: W0808 may be duplicative when the same header which causes this
166
+ # warning is included twice or more.
167
+ ensure_uniqueness_of :W0808
168
+
169
+ def initialize(context)
170
+ super
171
+ interp = context[:cpp_interpreter]
172
+ interp.on_object_like_macro_defined += method(:check)
173
+ @macro_table = context[:cpp_macro_table]
174
+ end
175
+
176
+ private
177
+ def check(define_line, macro)
178
+ identifier = define_line.identifier
179
+
180
+ if @macro_table.lookup(identifier.value)
181
+ W(:W0808, identifier.location, identifier.value)
182
+ end
183
+ end
184
+ end
185
+
150
186
  end
151
187
  end
@@ -94,6 +94,7 @@ module Cpp #:nodoc:
94
94
  W0483.new(context),
95
95
  W0511.new(context),
96
96
  W0528.new(context),
97
+ W0541.new(context),
97
98
  W0549.new(context),
98
99
  W0554.new(context),
99
100
  W0574.new(context),
@@ -108,6 +109,8 @@ module Cpp #:nodoc:
108
109
  W0696.new(context),
109
110
  W0804.new(context),
110
111
  W0806.new(context),
112
+ W0807.new(context),
113
+ W0808.new(context),
111
114
  W0831.new(context),
112
115
  W9002.new(context)
113
116
  ]
@@ -31,12 +31,15 @@
31
31
 
32
32
  require "adlint/token"
33
33
  require "adlint/util"
34
+ require "adlint/cpp/asm"
34
35
  require "adlint/cpp/subst"
35
36
 
36
37
  module AdLint #:nodoc:
37
38
  module Cpp #:nodoc:
38
39
 
39
40
  class PreprocessedSource
41
+ include InlineAssemblyDefinition
42
+
40
43
  def initialize(root_fpath)
41
44
  @root_fpath = root_fpath
42
45
  @tokens = []
@@ -45,6 +48,7 @@ module Cpp #:nodoc:
45
48
  extend Pluggable
46
49
 
47
50
  def_plugin :on_language_extension
51
+ def_plugin :on_inline_assembly
48
52
 
49
53
  attr_reader :root_fpath
50
54
 
@@ -68,6 +72,11 @@ module Cpp #:nodoc:
68
72
  substitution = create_arbitrary_substitution(pattern, replacement)
69
73
  @tokens = substitution.execute(@tokens)
70
74
  end
75
+
76
+ create_inline_assembly_substitutions(self).each do |substitution|
77
+ @tokens = substitution.execute(@tokens)
78
+ end
79
+
71
80
  self
72
81
  end
73
82
 
@@ -32,9 +32,9 @@
32
32
  module AdLint #:nodoc:
33
33
 
34
34
  MAJOR_VERSION = 1
35
- MINOR_VERSION = 4
35
+ MINOR_VERSION = 6
36
36
  PATCH_VERSION = 0
37
- RELEASE_DATE = "2012-03-29"
37
+ RELEASE_DATE = "2012-04-06"
38
38
 
39
39
  TRAITS_SCHEMA_VERSION = "1.0.0"
40
40
 
@@ -64,7 +64,7 @@ module AdLint #:nodoc:
64
64
  EOS
65
65
 
66
66
  AUTHOR = <<EOS
67
- Written by Yutaka Yanoh, Rie Shima and Code Quality Assessment Team of OGIS-RI Co.,Ltd.
67
+ Written by Yutaka Yanoh, Rie Shima and OGIS-RI Co.,Ltd.
68
68
 
69
69
  EOS
70
70
 
data/share/demo/Makefile CHANGED
@@ -11,6 +11,7 @@ bad_conv \
11
11
  bad_enum \
12
12
  bad_indent \
13
13
  bad_init \
14
+ bad_label \
14
15
  bad_line \
15
16
  bad_macro \
16
17
  bad_return \
@@ -32,6 +33,7 @@ implicit_conv \
32
33
  implicit_int \
33
34
  incomplete_type \
34
35
  indirect_recur \
36
+ inline_asm \
35
37
  intro_demo \
36
38
  invalid_call \
37
39
  kandr_fundef \
@@ -60,6 +62,8 @@ octal_const \
60
62
  output_by_param \
61
63
  overflow \
62
64
  press_release \
65
+ redundant_select \
66
+ reserved_ident \
63
67
  retn_lvar_addr \
64
68
  sequence_point \
65
69
  shift_expr \
@@ -44,5 +44,17 @@ int main(void)
44
44
  scanf("%3llc %fc\n", &i, &ii);
45
45
  scanf("%3llz %c\n", &i, &ii);
46
46
 
47
+ scanf("%[z-a]\n", &i);
48
+ scanf("%[abcd]\n", &i);
49
+ scanf("%[abca]\n", &i);
50
+
47
51
  return 0;
48
52
  }
53
+
54
+ static void foo(void)
55
+ {
56
+ char buf[256];
57
+
58
+ printf("%s", buf);
59
+ scanf("%s", buf);
60
+ }
@@ -3,24 +3,70 @@ enum Bar { BAR_A = 1, BAR_B, BAR_C };
3
3
  enum Baz { BAZ_A = 2, BAZ_B = 4, BAZ_C = 8 };
4
4
 
5
5
  extern void func1(enum Foo f);
6
+ int func3(int i)
7
+ {
8
+ const enum Foo foo = FOO_A;
9
+
10
+ foo1(i);
11
+ foo = i;
12
+ foo = FOO_A + i;
13
+
14
+ switch (i) {
15
+ case FOO_A:
16
+ return foo;
17
+ case FOO_B:
18
+ return FOO_B;
19
+ case FOO_C:
20
+ return i;
21
+ default:
22
+ return (int) BAR_A;
23
+ }
24
+ }
6
25
 
7
- enum Foo func2(const enum Foo param)
26
+ enum Foo func2(const enum Foo param, const int i)
8
27
  {
9
28
  enum Foo foo = BAR_A;
29
+ enum Bar bar = BAZ_A;
30
+ enum Baz baz = FOO_A;
31
+
10
32
  foo = FOO_A;
33
+ bar = BAR_A;
34
+ baz = BAZ_A;
35
+
36
+ func3(foo);
37
+ func3(BAR_A);
38
+ func3((int) BAZ_C);
11
39
 
12
40
  switch (param) {
13
41
  case FOO_A:
14
42
  foo = BAR_A;
15
43
  func1(BAR_A);
44
+ func1(1);
45
+ func1(baz);
46
+ foo = 1;
47
+ foo = bar;
16
48
  return BAR_B;
17
49
  case BAR_B:
18
50
  case 5:
19
51
  foo = BAZ_C;
20
52
  func1(BAZ_C);
53
+ func1(0x2);
54
+ baz = BAZ_C;
55
+ func1(baz);
56
+ foo = 0x2;
57
+ foo = baz;
21
58
  return BAZ_C;
22
59
  case 6:
23
- return 10;
60
+ return FOO_A + 10;
61
+ case 7:
62
+ return FOO_A + i;
63
+ case 8:
64
+ return bar;
65
+ case 9:
66
+ baz = BAZ_C;
67
+ return baz;
68
+ case 10:
69
+ return i;
24
70
  }
25
71
 
26
72
  return FOO_C;
@@ -0,0 +1,26 @@
1
+ int foo(const int i)
2
+ {
3
+ if (i == 0) {
4
+ label:
5
+ return 0;
6
+ }
7
+
8
+ if (i < 0) {
9
+ goto label;
10
+ }
11
+
12
+ label:
13
+ return 1;
14
+ }
15
+
16
+ int bar(const int i)
17
+ {
18
+ if (i == 0) {
19
+ goto label;
20
+ }
21
+
22
+ i = 0;
23
+
24
+ label:
25
+ return i;
26
+ }