adlint 1.8.10 → 1.10.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 (56) hide show
  1. data/ChangeLog +261 -3
  2. data/MANIFEST +25 -1
  3. data/NEWS +25 -5
  4. data/Rakefile +11 -0
  5. data/TODO +0 -1
  6. data/etc/mesg.d/en_US/messages.yml +1 -1
  7. data/etc/mesg.d/ja_JP/messages.yml +1 -1
  8. data/features/message_detection/W0001.feature +41 -0
  9. data/features/message_detection/W0002.feature +68 -0
  10. data/features/message_detection/W0003.feature +134 -0
  11. data/features/message_detection/W0007.feature +264 -0
  12. data/features/message_detection/W0010.feature +75 -0
  13. data/features/message_detection/W0013.feature +189 -0
  14. data/features/message_detection/W0109.feature +50 -0
  15. data/features/message_detection/W0583.feature +30 -0
  16. data/features/message_detection/W0606.feature +20 -0
  17. data/features/message_detection/W0698.feature +20 -0
  18. data/features/message_detection/W0699.feature +21 -0
  19. data/features/message_detection/W0703.feature +73 -0
  20. data/features/message_detection/W0716.feature +67 -0
  21. data/features/message_detection/W0717.feature +64 -0
  22. data/features/message_detection/W0718.feature +64 -0
  23. data/features/message_detection/W0723.feature +18 -0
  24. data/features/message_detection/W1031.feature +328 -0
  25. data/features/step_definitions/message_detection_steps.rb +45 -0
  26. data/features/support/env.rb +58 -0
  27. data/lib/adlint/c/branch.rb +16 -23
  28. data/lib/adlint/c/code.rb +1 -12
  29. data/lib/adlint/c/conv.rb +4 -4
  30. data/lib/adlint/c/ctrlexpr.rb +10 -6
  31. data/lib/adlint/c/domain.rb +2 -2
  32. data/lib/adlint/c/expr.rb +11 -33
  33. data/lib/adlint/c/format.rb +6 -6
  34. data/lib/adlint/c/interp.rb +137 -80
  35. data/lib/adlint/c/mediator.rb +5 -2
  36. data/lib/adlint/c/message.rb +123 -140
  37. data/lib/adlint/c/message_shima.rb +44 -0
  38. data/lib/adlint/c/object.rb +93 -26
  39. data/lib/adlint/c/option.rb +53 -0
  40. data/lib/adlint/c/phase.rb +4 -1
  41. data/lib/adlint/c/type.rb +112 -46
  42. data/lib/adlint/c.rb +1 -0
  43. data/lib/adlint/version.rb +3 -3
  44. data/share/doc/developers_guide_ja.html +3 -3
  45. data/share/doc/developers_guide_ja.texi +1 -1
  46. data/share/doc/users_guide_en.html +35 -28
  47. data/share/doc/users_guide_en.texi +30 -22
  48. data/share/doc/users_guide_ja.html +35 -31
  49. data/share/doc/users_guide_ja.texi +30 -24
  50. data/spec/adlint/c/type_spec.rb +110 -0
  51. data/spec/conf.d/default_traits.yml +216 -0
  52. data/spec/conf.d/empty_cinit.h +11 -0
  53. data/spec/conf.d/empty_pinit.h +11 -0
  54. data/spec/spec_helper.rb +49 -0
  55. metadata +27 -3
  56. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
@@ -0,0 +1,58 @@
1
+ require "aruba/cucumber"
2
+
3
+ NOARCH_TRAITS = <<EOF
4
+ version: "1.0.0"
5
+
6
+ project_traits:
7
+ project_name: "features"
8
+ include_path:
9
+ initial_header: "empty_pinit.h"
10
+ coding_style:
11
+ indent_style: "K&R"
12
+ tab_width: 8
13
+ indent_width: 4
14
+ file_encoding:
15
+
16
+ compiler_traits:
17
+ initial_header: "empty_cinit.h"
18
+ standard_type:
19
+ char_size: 8
20
+ char_alignment: 8
21
+ short_size: 16
22
+ short_alignment: 16
23
+ int_size: 32
24
+ int_alignment: 32
25
+ long_size: 32
26
+ long_alignment: 32
27
+ long_long_size: 64
28
+ long_long_alignment: 64
29
+ float_size: 32
30
+ float_alignment: 32
31
+ double_size: 64
32
+ double_alignment: 64
33
+ long_double_size: 96
34
+ long_double_alignment: 96
35
+ code_ptr_size: 32
36
+ code_ptr_alignment: 32
37
+ data_ptr_size: 32
38
+ data_ptr_alignment: 32
39
+ char_as_unsigned_char: true
40
+ include_path:
41
+ arithmetic:
42
+ logical_right_shift: true
43
+ extension_substitution:
44
+ arbitrary_substitution:
45
+ "typeof": "__typeof__"
46
+ "__typeof": "__typeof__"
47
+ "alignof": "__alignof__"
48
+ "__alignof": "__alignof__"
49
+ identifier_max: 128
50
+
51
+ linker_traits:
52
+ identifier_max: 128
53
+ identifier_ignore_case: false
54
+
55
+ message_traits:
56
+ language: "ja_JP"
57
+ change_list:
58
+ EOF
@@ -30,19 +30,13 @@
30
30
  #++
31
31
 
32
32
  require "adlint/c/ctrlexpr"
33
+ require "adlint/c/option"
33
34
 
34
35
  module AdLint #:nodoc:
35
36
  module C #:nodoc:
36
37
 
37
38
  class Branch
38
- module Option
39
- NARROWING = :narrowing
40
- WIDENING = :widening
41
- FIRST = :first
42
- FINAL = :final
43
- SMOTHER_BREAK = :smother_break
44
- IMPLICIT_CONDITION = :implicit_condition
45
- end
39
+ include BranchOptions
46
40
 
47
41
  def initialize(branch_group, *options)
48
42
  @group = branch_group
@@ -61,27 +55,27 @@ module C #:nodoc:
61
55
  end
62
56
 
63
57
  def narrowing?
64
- @options.include?(Option::NARROWING)
58
+ @options.include?(NARROWING)
65
59
  end
66
60
 
67
61
  def widening?
68
- @options.include?(Option::WIDENING)
62
+ @options.include?(WIDENING)
69
63
  end
70
64
 
71
65
  def first?
72
- @options.include?(Option::FIRST)
66
+ @options.include?(FIRST)
73
67
  end
74
68
 
75
69
  def final?
76
- @options.include?(Option::FINAL)
70
+ @options.include?(FINAL)
77
71
  end
78
72
 
79
73
  def smother_break?
80
- @options.include?(Option::SMOTHER_BREAK)
74
+ @options.include?(SMOTHER_BREAK)
81
75
  end
82
76
 
83
77
  def implicit_condition?
84
- @options.include?(Option::IMPLICIT_CONDITION)
78
+ @options.include?(IMPLICIT_CONDITION)
85
79
  end
86
80
 
87
81
  def execute(interpreter, expression = nil, &block)
@@ -134,7 +128,7 @@ module C #:nodoc:
134
128
  else
135
129
  raise "branch must be for narrowing or widening."
136
130
  end
137
- @group.all_condition_variables_value_exist?
131
+ @group.all_controlling_variables_value_exist?
138
132
  end
139
133
 
140
134
  def rethrow_break_event
@@ -152,9 +146,8 @@ module C #:nodoc:
152
146
  end
153
147
 
154
148
  class BranchGroup
155
- module Option
156
- COMPLETE = :complete
157
- end
149
+ include BranchOptions
150
+ include BranchGroupOptions
158
151
 
159
152
  def initialize(environment, *options)
160
153
  @environment = environment
@@ -169,11 +162,11 @@ module C #:nodoc:
169
162
  end
170
163
 
171
164
  def complete?
172
- @options.include?(Option::COMPLETE)
165
+ @options.include?(COMPLETE)
173
166
  end
174
167
 
175
168
  def create_first_branch(*options)
176
- new_branch = Branch.new(self, Branch::Option::FIRST, *options)
169
+ new_branch = Branch.new(self, FIRST, *options)
177
170
  @branches.push(new_branch)
178
171
  new_branch
179
172
  end
@@ -184,15 +177,15 @@ module C #:nodoc:
184
177
  new_branch
185
178
  end
186
179
 
187
- def all_condition_variables
180
+ def all_controlling_variables
188
181
  @branches.map { |branch|
189
182
  branch.controlling_expression ?
190
183
  branch.controlling_expression.affected_variables : []
191
184
  }.flatten.uniq
192
185
  end
193
186
 
194
- def all_condition_variables_value_exist?
195
- all_condition_variables.all? { |variable| variable.value.exist? }
187
+ def all_controlling_variables_value_exist?
188
+ all_controlling_variables.all? { |variable| variable.value.exist? }
196
189
  end
197
190
 
198
191
  def all_branches_break_with_break?
data/lib/adlint/c/code.rb CHANGED
@@ -213,10 +213,7 @@ module C #:nodoc:
213
213
  def initialize(context)
214
214
  super
215
215
  interp = context[:c_interpreter]
216
- interp.on_function_started += method(:extract_function)
217
- interp.on_block_started += method(:enter_block)
218
- interp.on_block_ended += method(:leave_block)
219
- @block_level = 0
216
+ interp.on_function_defined += method(:extract_function)
220
217
  end
221
218
 
222
219
  private
@@ -237,14 +234,6 @@ module C #:nodoc:
237
234
  function_definition.lines)
238
235
  end
239
236
  end
240
-
241
- def enter_block(*)
242
- @block_level += 1
243
- end
244
-
245
- def leave_block(*)
246
- @block_level -= 1
247
- end
248
237
  end
249
238
 
250
239
  class LabelDefExtraction < CodeExtraction
data/lib/adlint/c/conv.rb CHANGED
@@ -48,7 +48,7 @@ module C #:nodoc:
48
48
  return original unless original.type.integer?
49
49
 
50
50
  promoted_type = original.type.integer_promoted_type
51
- if promoted_type.same_as?(original.type)
51
+ if original.type.same_as?(promoted_type)
52
52
  original
53
53
  else
54
54
  do_conversion(original, promoted_type) || original
@@ -62,13 +62,13 @@ module C #:nodoc:
62
62
 
63
63
  arith_type = lhs_original.type.arithmetic_type_with(rhs_original.type)
64
64
 
65
- if arith_type.same_as?(lhs_original.type)
65
+ if lhs_original.type.same_as?(arith_type)
66
66
  lhs_converted = lhs_original
67
67
  else
68
68
  lhs_converted = do_conversion(lhs_original, arith_type) || lhs_original
69
69
  end
70
70
 
71
- if arith_type.same_as?(rhs_original.type)
71
+ if rhs_original.type.same_as?(arith_type)
72
72
  rhs_converted = rhs_original
73
73
  else
74
74
  rhs_converted = do_conversion(rhs_original, arith_type) || rhs_original
@@ -79,7 +79,7 @@ module C #:nodoc:
79
79
 
80
80
  def do_default_argument_promotion(original)
81
81
  promoted_type = original.type.argument_promoted_type
82
- if promoted_type.same_as?(original.type)
82
+ if original.type.same_as?(promoted_type)
83
83
  original
84
84
  else
85
85
  do_conversion(original, promoted_type) || original
@@ -64,12 +64,12 @@ module C #:nodoc:
64
64
  new_manip = ValueDomainNarrower.new(@interpreter, expression)
65
65
  begin
66
66
  if @branch.implicit_condition?
67
- @interpreter._suppress_notification = true
67
+ @interpreter._quiet = true
68
68
  end
69
69
  new_manip.prepare!
70
70
  ensure
71
71
  if @branch.implicit_condition?
72
- @interpreter._suppress_notification = false
72
+ @interpreter._quiet = false
73
73
  end
74
74
  end
75
75
  else
@@ -86,12 +86,12 @@ module C #:nodoc:
86
86
  new_manip = ValueDomainWidener.new(@interpreter, expression)
87
87
  begin
88
88
  if @branch.implicit_condition?
89
- @interpreter._suppress_notification = true
89
+ @interpreter._quiet = true
90
90
  end
91
91
  new_manip.prepare!
92
92
  ensure
93
93
  if @branch.implicit_condition?
94
- @interpreter._suppress_notification = false
94
+ @interpreter._quiet = false
95
95
  end
96
96
  end
97
97
  else
@@ -595,7 +595,7 @@ module C #:nodoc:
595
595
 
596
596
  private
597
597
  def commit_changes(narrowing)
598
- @branch_group.all_condition_variables.each do |variable|
598
+ @branch_group.all_controlling_variables.each do |variable|
599
599
  variable.narrow_value_domain!(:==, variable.type.arbitrary_value)
600
600
  end
601
601
  true
@@ -614,7 +614,7 @@ module C #:nodoc:
614
614
 
615
615
  private
616
616
  def commit_changes(narrowing)
617
- @branch_group.all_condition_variables.each do |variable|
617
+ @branch_group.all_controlling_variables.each do |variable|
618
618
  variable.widen_value_domain!(:==, variable.type.arbitrary_value)
619
619
  end
620
620
  true
@@ -649,6 +649,10 @@ module C #:nodoc:
649
649
  @children.each do |narrowing|
650
650
  @narrowed_values = narrowing.narrowed_values.merge(@narrowed_values)
651
651
  end
652
+ ensure
653
+ if sequence_point = node.subsequent_sequence_point
654
+ notify_sequence_point_reached(sequence_point)
655
+ end
652
656
  end
653
657
 
654
658
  def ensure_result_equal_to(value)
@@ -4849,10 +4849,10 @@ module C #:nodoc:
4849
4849
  ValueDomain.of_unlimited
4850
4850
  else
4851
4851
  case
4852
- when lhs_domain.value < 0
4853
- ValueDomain.of_unlimited
4854
4852
  when lhs_domain.value >= 0
4855
4853
  ValueDomain.greater_than(0)
4854
+ when lhs_domain.value < 0
4855
+ ValueDomain.less_than(0)
4856
4856
  end
4857
4857
  end
4858
4858
  end
data/lib/adlint/c/expr.rb CHANGED
@@ -815,7 +815,7 @@ module C #:nodoc:
815
815
  rhs_object, rhs_variable)
816
816
  end
817
817
 
818
- if lhs_variable.type.same_as?(rhs_variable.type)
818
+ if rhs_variable.type.same_as?(lhs_variable.type)
819
819
  rhs_converted = rhs_variable
820
820
  else
821
821
  rhs_converted =
@@ -911,7 +911,7 @@ module C #:nodoc:
911
911
  notify_multiplicative_expr_evaled(node, lhs_variable, rhs_variable,
912
912
  result_variable)
913
913
 
914
- if lhs_variable.type.same_as?(result_variable.type)
914
+ if result_variable.type.same_as?(lhs_variable.type)
915
915
  result_converted = result_variable
916
916
  else
917
917
  result_converted =
@@ -962,7 +962,7 @@ module C #:nodoc:
962
962
  notify_multiplicative_expr_evaled(node, lhs_variable, rhs_variable,
963
963
  result_variable)
964
964
 
965
- if lhs_variable.type.same_as?(result_variable.type)
965
+ if result_variable.type.same_as?(lhs_variable.type)
966
966
  result_converted = result_variable
967
967
  else
968
968
  result_converted =
@@ -1013,7 +1013,7 @@ module C #:nodoc:
1013
1013
  notify_multiplicative_expr_evaled(node, lhs_variable, rhs_variable,
1014
1014
  result_variable)
1015
1015
 
1016
- if lhs_variable.type.same_as?(result_variable.type)
1016
+ if result_variable.type.same_as?(lhs_variable.type)
1017
1017
  result_converted = result_variable
1018
1018
  else
1019
1019
  result_converted =
@@ -1063,7 +1063,7 @@ module C #:nodoc:
1063
1063
  notify_additive_expr_evaled(node, lhs_variable, rhs_variable,
1064
1064
  result_variable)
1065
1065
 
1066
- if lhs_variable.type.same_as?(result_variable.type)
1066
+ if result_variable.type.same_as?(lhs_variable.type)
1067
1067
  result_converted = result_variable
1068
1068
  else
1069
1069
  result_converted =
@@ -1113,7 +1113,7 @@ module C #:nodoc:
1113
1113
  notify_additive_expr_evaled(node, lhs_variable, rhs_variable,
1114
1114
  result_variable)
1115
1115
 
1116
- if lhs_variable.type.same_as?(result_variable.type)
1116
+ if result_variable.type.same_as?(lhs_variable.type)
1117
1117
  result_converted = result_variable
1118
1118
  else
1119
1119
  result_converted =
@@ -1171,7 +1171,7 @@ module C #:nodoc:
1171
1171
  notify_shift_expr_evaled(node, lhs_converted, rhs_converted,
1172
1172
  result_variable)
1173
1173
 
1174
- if lhs_variable.type.same_as?(result_variable.type)
1174
+ if result_variable.type.same_as?(lhs_variable.type)
1175
1175
  result_converted = result_variable
1176
1176
  else
1177
1177
  result_converted =
@@ -1229,7 +1229,7 @@ module C #:nodoc:
1229
1229
  notify_shift_expr_evaled(node, lhs_converted, rhs_converted,
1230
1230
  result_variable)
1231
1231
 
1232
- if lhs_variable.type.same_as?(result_variable.type)
1232
+ if result_variable.type.same_as?(lhs_variable.type)
1233
1233
  result_converted = result_variable
1234
1234
  else
1235
1235
  result_converted =
@@ -1278,7 +1278,7 @@ module C #:nodoc:
1278
1278
 
1279
1279
  notify_and_expr_evaled(node, lhs_variable, rhs_variable, result_variable)
1280
1280
 
1281
- if lhs_variable.type.same_as?(result_variable.type)
1281
+ if result_variable.type.same_as?(lhs_variable.type)
1282
1282
  result_converted = result_variable
1283
1283
  else
1284
1284
  result_converted =
@@ -1328,7 +1328,7 @@ module C #:nodoc:
1328
1328
  notify_exclusive_or_expr_evaled(node, lhs_variable, rhs_variable,
1329
1329
  result_variable)
1330
1330
 
1331
- if lhs_variable.type.same_as?(result_variable.type)
1331
+ if result_variable.type.same_as?(lhs_variable.type)
1332
1332
  result_converted = result_variable
1333
1333
  else
1334
1334
  result_converted =
@@ -1378,7 +1378,7 @@ module C #:nodoc:
1378
1378
  notify_inclusive_or_expr_evaled(node, lhs_variable, rhs_variable,
1379
1379
  result_variable)
1380
1380
 
1381
- if lhs_variable.type.same_as?(result_variable.type)
1381
+ if result_variable.type.same_as?(lhs_variable.type)
1382
1382
  result_converted = result_variable
1383
1383
  else
1384
1384
  result_converted =
@@ -1796,28 +1796,6 @@ module C #:nodoc:
1796
1796
  result
1797
1797
  end
1798
1798
 
1799
- def visit_conditional_expression(node)
1800
- checkpoint(node.location)
1801
-
1802
- condition_variable = object_to_variable(node.condition.accept(self))
1803
-
1804
- case
1805
- when condition_variable.value.must_be_true?
1806
- result_variable = object_to_variable(node.then_expression.accept(self))
1807
- when condition_variable.value.must_be_false?
1808
- result_variable = object_to_variable(node.else_expression.accept(self))
1809
- else
1810
- then_var = object_to_variable(node.then_expression.accept(self))
1811
- else_var = object_to_variable(node.else_expression.accept(self))
1812
- result_value = then_var.value.single_value_unified_with(else_var.value)
1813
- result_variable = temporary_variable(then_var.type, result_value)
1814
- end
1815
-
1816
- notify_conditional_expr_evaled(node, condition_variable, result_variable)
1817
-
1818
- result_variable
1819
- end
1820
-
1821
1799
  def visit_simple_assignment_expression(node)
1822
1800
  checkpoint(node.location)
1823
1801
 
@@ -765,15 +765,15 @@ module C #:nodoc:
765
765
  # Boolean -- True if types of arguments match this directive.
766
766
  def acceptable?
767
767
  if @field_width_argument
768
- unless signed_int_type.same_as?(@field_width_argument.type) ||
769
- unsigned_int_type.same_as?(@field_width_argument.type)
768
+ unless @field_width_argument.type.convertible?(signed_int_type) ||
769
+ @field_width_argument.type.convertible?(unsigned_int_type)
770
770
  return false
771
771
  end
772
772
  end
773
773
 
774
774
  if @precision_argument
775
- unless signed_int_type.same_as?(@precision_argument.type) ||
776
- unsigned_int_type.same_as?(@precision_argument.type)
775
+ unless @precision_argument.type.convertible?(signed_int_type) ||
776
+ @precision_argument.type.convertible?(unsigned_int_type)
777
777
  return false
778
778
  end
779
779
  end
@@ -781,7 +781,7 @@ module C #:nodoc:
781
781
  if @conversion_argument
782
782
  if argument_types
783
783
  argument_types.any? do |arg_type|
784
- arg_type.same_as?(@conversion_argument.type)
784
+ @conversion_argument.type.convertible?(arg_type)
785
785
  end
786
786
  else
787
787
  true
@@ -2502,7 +2502,7 @@ module C #:nodoc:
2502
2502
  if @conversion_argument
2503
2503
  if argument_types
2504
2504
  argument_types.any? do |arg_type|
2505
- arg_type.same_as?(@conversion_argument.type)
2505
+ @conversion_argument.type.convertible?(arg_type)
2506
2506
  end
2507
2507
  else
2508
2508
  true