adlint 1.2.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/adlint/c/type.rb CHANGED
@@ -312,6 +312,10 @@ module C #:nodoc:
312
312
  subclass_responsibility
313
313
  end
314
314
 
315
+ def enumerators
316
+ subclass_responsibility
317
+ end
318
+
315
319
  def length
316
320
  subclass_responsibility
317
321
  end
@@ -763,6 +767,10 @@ module C #:nodoc:
763
767
  []
764
768
  end
765
769
 
770
+ def enumerators
771
+ []
772
+ end
773
+
766
774
  def length
767
775
  0
768
776
  end
@@ -1279,6 +1287,10 @@ module C #:nodoc:
1279
1287
  []
1280
1288
  end
1281
1289
 
1290
+ def enumerators
1291
+ []
1292
+ end
1293
+
1282
1294
  def length
1283
1295
  0
1284
1296
  end
@@ -1793,6 +1805,10 @@ module C #:nodoc:
1793
1805
  @base_type.parameter_types
1794
1806
  end
1795
1807
 
1808
+ def enumerators
1809
+ @base_type.enumerators
1810
+ end
1811
+
1796
1812
  def length
1797
1813
  @base_type.length
1798
1814
  end
@@ -2098,6 +2114,10 @@ module C #:nodoc:
2098
2114
  []
2099
2115
  end
2100
2116
 
2117
+ def enumerators
2118
+ []
2119
+ end
2120
+
2101
2121
  def length
2102
2122
  0
2103
2123
  end
@@ -2615,6 +2635,10 @@ module C #:nodoc:
2615
2635
  @have_va_list
2616
2636
  end
2617
2637
 
2638
+ def enumerators
2639
+ []
2640
+ end
2641
+
2618
2642
  def length
2619
2643
  0
2620
2644
  end
@@ -3159,6 +3183,10 @@ module C #:nodoc:
3159
3183
  []
3160
3184
  end
3161
3185
 
3186
+ def enumerators
3187
+ subclass_responsibility
3188
+ end
3189
+
3162
3190
  def length
3163
3191
  0
3164
3192
  end
@@ -3484,6 +3512,10 @@ module C #:nodoc:
3484
3512
  @explicitly_signed
3485
3513
  end
3486
3514
 
3515
+ def enumerators
3516
+ subclass_responsibility
3517
+ end
3518
+
3487
3519
  def min_value
3488
3520
  if @signed
3489
3521
  -2**(@bit_size - 1)
@@ -3590,6 +3622,10 @@ module C #:nodoc:
3590
3622
  false
3591
3623
  end
3592
3624
 
3625
+ def enumerators
3626
+ []
3627
+ end
3628
+
3593
3629
  def integer_conversion_rank
3594
3630
  subclass_responsibility
3595
3631
  end
@@ -4854,6 +4890,10 @@ module C #:nodoc:
4854
4890
  false
4855
4891
  end
4856
4892
 
4893
+ def enum?
4894
+ false
4895
+ end
4896
+
4857
4897
  def bitfield?
4858
4898
  false
4859
4899
  end
@@ -4866,6 +4906,10 @@ module C #:nodoc:
4866
4906
  true
4867
4907
  end
4868
4908
 
4909
+ def enumerators
4910
+ []
4911
+ end
4912
+
4869
4913
  def min_value
4870
4914
  (-2**fraction_bit_size * 10**(exponent_bit_size - 1)).to_f
4871
4915
  end
@@ -5084,6 +5128,10 @@ module C #:nodoc:
5084
5128
  @base_type.unresolved?
5085
5129
  end
5086
5130
 
5131
+ def enumerators
5132
+ []
5133
+ end
5134
+
5087
5135
  def integer_conversion_rank
5088
5136
  -1
5089
5137
  end
@@ -5186,6 +5234,10 @@ module C #:nodoc:
5186
5234
  "enum #{name}"
5187
5235
  end
5188
5236
 
5237
+ def enumerators
5238
+ declarations.map { |decl| decl.enumerators }.compact.flatten.uniq
5239
+ end
5240
+
5189
5241
  def integer_conversion_rank
5190
5242
  # NOTE: The ISO C99 standard saids;
5191
5243
  #
@@ -5304,6 +5356,10 @@ module C #:nodoc:
5304
5356
  false
5305
5357
  end
5306
5358
 
5359
+ def enumerators
5360
+ []
5361
+ end
5362
+
5307
5363
  def integer_conversion_rank
5308
5364
  # NOTE: Pointer variables must not be converted implicitly.
5309
5365
  100
@@ -5562,6 +5618,10 @@ module C #:nodoc:
5562
5618
  []
5563
5619
  end
5564
5620
 
5621
+ def enumerators
5622
+ []
5623
+ end
5624
+
5565
5625
  def members
5566
5626
  []
5567
5627
  end
@@ -6118,6 +6178,10 @@ module C #:nodoc:
6118
6178
  []
6119
6179
  end
6120
6180
 
6181
+ def enumerators
6182
+ []
6183
+ end
6184
+
6121
6185
  def length
6122
6186
  0
6123
6187
  end
@@ -6651,6 +6715,7 @@ module C #:nodoc:
6651
6715
  def_delegator :@base_type, :have_va_list?
6652
6716
  def_delegator :@base_type, :return_type
6653
6717
  def_delegator :@base_type, :parameter_types
6718
+ def_delegator :@base_type, :enumerators
6654
6719
  def_delegator :@base_type, :length
6655
6720
  def_delegator :@base_type, :impl_length
6656
6721
  def_delegator :@base_type, :members
@@ -6792,6 +6857,7 @@ module C #:nodoc:
6792
6857
  def_delegator :@type, :have_va_list?
6793
6858
  def_delegator :@type, :return_type
6794
6859
  def_delegator :@type, :parameter_types
6860
+ def_delegator :@type, :enumerators
6795
6861
  def_delegator :@type, :length
6796
6862
  def_delegator :@type, :impl_length
6797
6863
  def_delegator :@type, :members
@@ -6882,6 +6948,10 @@ module C #:nodoc:
6882
6948
  false
6883
6949
  end
6884
6950
 
6951
+ def enumerators
6952
+ []
6953
+ end
6954
+
6885
6955
  def integer_conversion_rank
6886
6956
  # NOTE: The ISO C99 standard saids;
6887
6957
  #
@@ -61,6 +61,7 @@ module Cpp #:nodoc:
61
61
  def_plugin :on_object_like_macro_defined
62
62
  def_plugin :on_function_like_macro_defined
63
63
  def_plugin :on_va_function_like_macro_defined
64
+ def_plugin :on_macro_undefined
64
65
  def_plugin :on_asm_section_evaled
65
66
  def_plugin :on_unknown_pragma_evaled
66
67
  def_plugin :on_pp_token_extracted
@@ -492,8 +493,14 @@ module Cpp #:nodoc:
492
493
  unless new_line = context.next_token and new_line.type == :NEW_LINE
493
494
  return nil
494
495
  end
496
+
497
+ undef_line = UndefLine.new(keyword, identifier)
498
+ macro = context.macro_table.lookup(identifier.value)
499
+ # NOTE: Undefining macro may be nil if not defined.
500
+ notify_macro_undefined(undef_line, macro)
501
+
495
502
  context.macro_table.undef(identifier.value)
496
- UndefLine.new(keyword, identifier)
503
+ undef_line
497
504
  end
498
505
 
499
506
  def line_line(context)
@@ -803,6 +810,10 @@ module Cpp #:nodoc:
803
810
  on_va_function_like_macro_defined.invoke(define_line, macro)
804
811
  end
805
812
 
813
+ def notify_macro_undefined(undef_line, macro)
814
+ on_macro_undefined.invoke(undef_line, macro)
815
+ end
816
+
806
817
  def notify_asm_section_evaled(asm_section)
807
818
  on_asm_section_evaled.invoke(asm_section)
808
819
  end
@@ -35,6 +35,25 @@ require "adlint/message"
35
35
  module AdLint #:nodoc:
36
36
  module Cpp #:nodoc:
37
37
 
38
+ class W0687 < PassiveMessageDetection
39
+ # NOTE: W0687 may be duplicative when the same header which causes this
40
+ # warning is included twice or more.
41
+ ensure_uniqueness_of :W0687
42
+
43
+ def initialize(context)
44
+ super
45
+ interp = context[:cpp_interpreter]
46
+ interp.on_macro_undefined += method(:check)
47
+ end
48
+
49
+ private
50
+ def check(undef_line, macro)
51
+ if undef_line.identifier.value == "defined"
52
+ W(:W0687, undef_line.identifier.location)
53
+ end
54
+ end
55
+ end
56
+
38
57
  class W0688 < PassiveMessageDetection
39
58
  # NOTE: W0688 may be duplicative when the same header which causes this
40
59
  # warning is included twice or more.
@@ -96,5 +115,37 @@ module Cpp #:nodoc:
96
115
  end
97
116
  end
98
117
 
118
+ class W0695 < W0687
119
+ # NOTE: W0695 may be duplicative when the same header which causes this
120
+ # warning is included twice or more.
121
+ ensure_uniqueness_of :W0695
122
+
123
+ private
124
+ def check(undef_line, macro)
125
+ if undef_line.identifier.value == "assert"
126
+ W(:W0695, undef_line.identifier.location)
127
+ end
128
+ end
129
+ end
130
+
131
+ class W0806 < PassiveMessageDetection
132
+ # NOTE: W0806 may be duplicative when the same header which causes this
133
+ # warning is included twice or more.
134
+ ensure_uniqueness_of :W0806
135
+
136
+ def initialize(context)
137
+ super
138
+ interp = context[:cpp_interpreter]
139
+ interp.on_object_like_macro_defined += method(:check)
140
+ end
141
+
142
+ private
143
+ def check(define_line, macro)
144
+ if define_line.identifier.value == "defined"
145
+ W(:W0806, define_line.identifier.location)
146
+ end
147
+ end
148
+ end
149
+
99
150
  end
100
151
  end
@@ -100,11 +100,14 @@ module Cpp #:nodoc:
100
100
  W0575.new(context),
101
101
  W0576.new(context),
102
102
  W0577.new(context),
103
+ W0687.new(context),
103
104
  W0688.new(context),
104
105
  W0689.new(context),
105
106
  W0690.new(context),
107
+ W0695.new(context),
106
108
  W0696.new(context),
107
109
  W0804.new(context),
110
+ W0806.new(context),
108
111
  W0831.new(context),
109
112
  W9002.new(context)
110
113
  ]
@@ -32,9 +32,9 @@
32
32
  module AdLint #:nodoc:
33
33
 
34
34
  MAJOR_VERSION = 1
35
- MINOR_VERSION = 2
35
+ MINOR_VERSION = 4
36
36
  PATCH_VERSION = 0
37
- RELEASE_DATE = "2012-03-21"
37
+ RELEASE_DATE = "2012-03-29"
38
38
 
39
39
  TRAITS_SCHEMA_VERSION = "1.0.0"
40
40
 
data/share/demo/Makefile CHANGED
@@ -8,10 +8,12 @@ bad_charset \
8
8
  bad_comment \
9
9
  bad_const \
10
10
  bad_conv \
11
+ bad_enum \
11
12
  bad_indent \
12
13
  bad_init \
13
14
  bad_line \
14
15
  bad_macro \
16
+ bad_return \
15
17
  bitwise_expr \
16
18
  call_by_value \
17
19
  cross_ref \
@@ -71,6 +73,7 @@ uninit_vars \
71
73
  union_type \
72
74
  unmatch_decl \
73
75
  unmatch_paren_macro \
76
+ unnamed_member \
74
77
  unreachable \
75
78
  useless_exp_funs \
76
79
  useless_exp_vars \
@@ -0,0 +1,27 @@
1
+ enum Foo { FOO_A, FOO_B, FOO_C };
2
+ enum Bar { BAR_A = 1, BAR_B, BAR_C };
3
+ enum Baz { BAZ_A = 2, BAZ_B = 4, BAZ_C = 8 };
4
+
5
+ extern void func1(enum Foo f);
6
+
7
+ enum Foo func2(const enum Foo param)
8
+ {
9
+ enum Foo foo = BAR_A;
10
+ foo = FOO_A;
11
+
12
+ switch (param) {
13
+ case FOO_A:
14
+ foo = BAR_A;
15
+ func1(BAR_A);
16
+ return BAR_B;
17
+ case BAR_B:
18
+ case 5:
19
+ foo = BAZ_C;
20
+ func1(BAZ_C);
21
+ return BAZ_C;
22
+ case 6:
23
+ return 10;
24
+ }
25
+
26
+ return FOO_C;
27
+ }
@@ -95,3 +95,7 @@ static void bar(int i)
95
95
  #define RETURN return
96
96
  #define BREAK break
97
97
  #define CONTINUE continue
98
+
99
+ #undef assert
100
+ #define defined !defined
101
+ #undef defined
@@ -0,0 +1,83 @@
1
+ int ansi_int_func_1(const int i)
2
+ {
3
+ if (i == 0) {
4
+ return;
5
+ }
6
+ else {
7
+ return i * 2;
8
+ }
9
+ }
10
+
11
+ int kandr_int_func_1(i)
12
+ const int i;
13
+ {
14
+ if (i == 0) {
15
+ return;
16
+ }
17
+ else {
18
+ return i * 2;
19
+ }
20
+ }
21
+
22
+ static void ansi_void_func(const int i)
23
+ {
24
+ if (i == 0) {
25
+ return;
26
+ }
27
+ else {
28
+ return i * 2;
29
+ }
30
+ }
31
+
32
+ static void kandr_void_func(i)
33
+ const int i;
34
+ {
35
+ if (i == 0) {
36
+ return;
37
+ }
38
+ else {
39
+ return i * 2;
40
+ }
41
+ }
42
+
43
+ ansi_int_func_2(const i)
44
+ {
45
+ if (i == 0) {
46
+ return;
47
+ }
48
+ else {
49
+ return i * 2;
50
+ }
51
+ }
52
+
53
+ kandr_int_func2(i)
54
+ const i;
55
+ {
56
+ if (i == 0) {
57
+ return;
58
+ }
59
+ else {
60
+ return i * 2;
61
+ }
62
+ }
63
+
64
+ const void ansi_qualified_void_func_1(const int i)
65
+ {
66
+ if (i == 0) {
67
+ return;
68
+ }
69
+ else {
70
+ return i * 2;
71
+ }
72
+ }
73
+
74
+ volatile void kandr_qualified_void_func_1(i)
75
+ const int i;
76
+ {
77
+ if (i == 0) {
78
+ return;
79
+ }
80
+ else {
81
+ return i * 2;
82
+ }
83
+ }