adlint 3.0.4 → 3.0.8

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 (73) hide show
  1. data/ChangeLog +374 -13
  2. data/INSTALL +1 -3
  3. data/MANIFEST +12 -0
  4. data/NEWS +30 -4
  5. data/README +0 -4
  6. data/TODO +2 -1
  7. data/etc/mesg.d/c_builtin/en_US/messages.yml +2 -2
  8. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +2 -2
  9. data/etc/mesg.d/core/en_US/messages.yml +5 -1
  10. data/etc/mesg.d/core/ja_JP/messages.yml +5 -1
  11. data/features/code_check/W0422.feature +128 -0
  12. data/features/code_check/W0491.feature +57 -0
  13. data/features/code_check/W0492.feature +80 -0
  14. data/features/code_check/W0542.feature +20 -0
  15. data/features/code_check/W0580.feature +25 -0
  16. data/features/code_check/W0610.feature +36 -0
  17. data/features/code_check/W0642.feature +67 -0
  18. data/features/code_check/W0786.feature +39 -0
  19. data/features/code_check/W0830.feature +27 -0
  20. data/features/code_check/W1047.feature +72 -0
  21. data/features/code_check/W9003.feature +22 -0
  22. data/features/code_extraction/TODO +1 -0
  23. data/features/metric_measurement/TODO +1 -0
  24. data/lib/adlint/analyzer.rb +2 -2
  25. data/lib/adlint/cc1/ctrlexpr.rb +27 -6
  26. data/lib/adlint/cc1/domain.rb +72 -12
  27. data/lib/adlint/cc1/enum.rb +4 -0
  28. data/lib/adlint/cc1/expr.rb +31 -29
  29. data/lib/adlint/cc1/interp.rb +45 -56
  30. data/lib/adlint/cc1/lexer.rb +26 -5
  31. data/lib/adlint/cc1/mediator.rb +35 -6
  32. data/lib/adlint/cc1/object.rb +62 -19
  33. data/lib/adlint/cc1/parser.rb +948 -904
  34. data/lib/adlint/cc1/parser.y +59 -29
  35. data/lib/adlint/cc1/phase.rb +6 -8
  36. data/lib/adlint/cc1/syntax.rb +70 -17
  37. data/lib/adlint/cc1/util.rb +4 -4
  38. data/lib/adlint/code.rb +16 -6
  39. data/lib/adlint/cpp/eval.rb +31 -25
  40. data/lib/adlint/cpp/lexer.rb +11 -5
  41. data/lib/adlint/cpp/macro.rb +34 -7
  42. data/lib/adlint/cpp/phase.rb +8 -8
  43. data/lib/adlint/error.rb +6 -0
  44. data/lib/adlint/exam/c_builtin/cc1_check.rb +557 -594
  45. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +72 -72
  46. data/lib/adlint/exam/c_builtin/cc1_code.rb +72 -52
  47. data/lib/adlint/exam/c_builtin/cc1_metric.rb +131 -131
  48. data/lib/adlint/exam/c_builtin/cpp_check.rb +48 -48
  49. data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +2 -2
  50. data/lib/adlint/exam/c_builtin/cpp_code.rb +21 -21
  51. data/lib/adlint/exam/c_builtin/ld_check.rb +88 -87
  52. data/lib/adlint/exam/c_builtin/ld_metric.rb +4 -5
  53. data/lib/adlint/exam/c_builtin.rb +6 -6
  54. data/lib/adlint/ld/object.rb +269 -186
  55. data/lib/adlint/ld/phase.rb +19 -19
  56. data/lib/adlint/ld/typedef.rb +7 -7
  57. data/lib/adlint/ld/util.rb +25 -17
  58. data/lib/adlint/location.rb +6 -1
  59. data/lib/adlint/memo.rb +66 -13
  60. data/lib/adlint/prelude.rb +2 -2
  61. data/lib/adlint/report.rb +13 -14
  62. data/lib/adlint/util.rb +1 -1
  63. data/lib/adlint/version.rb +2 -2
  64. data/share/doc/Makefile +6 -2
  65. data/share/doc/c99gram.dot +502 -0
  66. data/share/doc/c99gram.pdf +0 -0
  67. data/share/doc/developers_guide_ja.html +4 -3
  68. data/share/doc/developers_guide_ja.texi +2 -1
  69. data/share/doc/users_guide_en.html +9 -9
  70. data/share/doc/users_guide_en.texi +7 -7
  71. data/share/doc/users_guide_ja.html +9 -9
  72. data/share/doc/users_guide_ja.texi +7 -7
  73. metadata +14 -2
@@ -97,6 +97,7 @@ module Cc1 #:nodoc:
97
97
  def_delegator :variable_table, :declare, :declare_variable
98
98
  def_delegator :variable_table, :define, :define_variable
99
99
  def_delegator :variable_table, :storage_duration_of
100
+ def_delegator :variable_table, :designators, :variable_designators
100
101
 
101
102
  def local_variables
102
103
  variable_table.all_named_variables.select { |var| var.scope.local? }
@@ -114,6 +115,7 @@ module Cc1 #:nodoc:
114
115
  extend Forwardable
115
116
 
116
117
  def_delegator :function_table, :lookup, :function_named
118
+ def_delegator :function_table, :designators, :function_designators
117
119
 
118
120
  def declare_explicit_function(fun_dcl)
119
121
  function_table.declare_explicitly(fun_dcl)
@@ -145,6 +147,7 @@ module Cc1 #:nodoc:
145
147
 
146
148
  def_delegator :enumerator_table, :lookup, :enumerator_named
147
149
  def_delegator :enumerator_table, :define, :define_enumerator
150
+ def_delegator :enumerator_table, :designators, :enumerator_designators
148
151
  end
149
152
 
150
153
  module NotifierMediator
@@ -174,6 +177,7 @@ module Cc1 #:nodoc:
174
177
  def_delegator :interpreter, :notify_sizeof_type_expr_evaled
175
178
  def_delegator :interpreter, :notify_explicit_conv_performed
176
179
  def_delegator :interpreter, :notify_implicit_conv_performed
180
+ def_delegator :interpreter, :notify_address_derivation_performed
177
181
  def_delegator :interpreter, :notify_array_subscript_expr_evaled
178
182
  def_delegator :interpreter, :notify_function_call_expr_evaled
179
183
  def_delegator :interpreter, :notify_unary_arithmetic_expr_evaled
@@ -239,6 +243,9 @@ module Cc1 #:nodoc:
239
243
  include EnumeratorTableMediator
240
244
  include ArithmeticAccessor
241
245
 
246
+ include InterpObjectBridge
247
+ include InterpSyntaxBridge
248
+
242
249
  def interpret(node, *opts)
243
250
  interpreter.execute(node, *opts)
244
251
  end
@@ -247,12 +254,6 @@ module Cc1 #:nodoc:
247
254
  environment.reset
248
255
  end
249
256
 
250
- extend Forwardable
251
-
252
- def_delegator :interpreter, :object_to_variable
253
- def_delegator :interpreter, :value_of
254
- def_delegator :interpreter, :pointer_value_of
255
-
256
257
  def scalar_value_of(numeric)
257
258
  ScalarValue.of(numeric, logical_right_shift?)
258
259
  end
@@ -269,6 +270,34 @@ module Cc1 #:nodoc:
269
270
  ScalarValue.of_arbitrary(logical_right_shift?)
270
271
  end
271
272
 
273
+ def constant_expression?(expr)
274
+ expr.constant?(_interp_syntax_bridge_)
275
+ end
276
+
277
+ def object_to_variable(obj, init_or_expr = nil)
278
+ obj.to_variable(_interp_object_bridge_).tap do |var|
279
+ if init_or_expr && !obj.type.pointer? && var.type.pointer?
280
+ notify_address_derivation_performed(init_or_expr, obj, var)
281
+ end
282
+ end
283
+ end
284
+
285
+ def object_to_pointer(obj, init_or_expr = nil)
286
+ obj.to_pointer(_interp_object_bridge_).tap do |ptr|
287
+ if init_or_expr
288
+ notify_address_derivation_performed(init_or_expr, obj, ptr)
289
+ end
290
+ end
291
+ end
292
+
293
+ def value_of(obj)
294
+ obj.to_value(_interp_object_bridge_)
295
+ end
296
+
297
+ def pointer_value_of(obj)
298
+ obj.to_pointer_value(_interp_object_bridge_)
299
+ end
300
+
272
301
  private
273
302
  def scoped_eval(&block)
274
303
  environment.enter_scope
@@ -147,6 +147,18 @@ module Cc1 #:nodoc:
147
147
  end
148
148
  end
149
149
 
150
+ module InterpObjectBridge
151
+ # NOTE: InterpreterMediator includes this module to bridge runtime object
152
+ # creator to this layer.
153
+
154
+ def _interp_object_bridge_
155
+ {
156
+ create_tmpvar: method(:create_tmpvar),
157
+ scalar_value_of: method(:scalar_value_of)
158
+ }
159
+ end
160
+ end
161
+
150
162
  class TypedObject < Object
151
163
  def initialize(type, dcl_or_def = nil)
152
164
  super(dcl_or_def)
@@ -154,6 +166,35 @@ module Cc1 #:nodoc:
154
166
  end
155
167
 
156
168
  attr_reader :type
169
+
170
+ def to_variable(interp_bridge)
171
+ if function? or variable? && @type.array?
172
+ to_pointer(interp_bridge)
173
+ else
174
+ self
175
+ end
176
+ end
177
+
178
+ def to_pointer(interp_bridge)
179
+ if @type.array?
180
+ ptr_type = @type.type_table.pointer_type(@type.base_type)
181
+ else
182
+ ptr_type = @type.type_table.pointer_type(@type)
183
+ end
184
+ interp_bridge[:create_tmpvar][ptr_type, to_pointer_value(interp_bridge)]
185
+ end
186
+
187
+ def to_value(interp_bridge)
188
+ if @type.array? || @type.function?
189
+ to_pointer_value(interp_bridge)
190
+ else
191
+ value.to_single_value
192
+ end
193
+ end
194
+
195
+ def to_pointer_value(interp_bridge)
196
+ interp_bridge[:scalar_value_of][binding.memory.address]
197
+ end
157
198
  end
158
199
 
159
200
  # == DESCRIPTION
@@ -643,6 +684,10 @@ module Cc1 #:nodoc:
643
684
  nil
644
685
  end
645
686
 
687
+ def designators
688
+ @named_variables.map { |hash| hash.keys }.flatten.to_set
689
+ end
690
+
646
691
  def enter_variables_value_versioning_group
647
692
  @named_variables.each do |hash|
648
693
  hash.each_value { |var| var.enter_value_versioning_group }
@@ -837,35 +882,29 @@ module Cc1 #:nodoc:
837
882
  private
838
883
  def assign_arguments_to_parameters(interp, args)
839
884
  args.zip(type.parameter_types).each do |(arg, expr), param_type|
885
+ arg_var = interp.object_to_variable(arg, expr)
886
+
840
887
  if param_type
841
888
  case
842
- when arg.type.array? && param_type.pointer?
843
- conved = interp.create_tmpvar(param_type,
844
- interp.pointer_value_of(arg))
845
- when arg.type.pointer? && param_type.array?
846
- conved = interp.pointee_of(arg)
847
- when arg.type.function? && param_type.pointer?
848
- conved = interp.create_tmpvar(param_type,
849
- interp.pointer_value_of(arg))
850
- when arg.variable? && !arg.type.same_as?(param_type)
851
- conved = interp.do_conversion(arg, param_type) ||
889
+ when arg_var.type.pointer? && param_type.array?
890
+ conved = interp.pointee_of(arg_var)
891
+ when !arg_var.type.same_as?(param_type)
892
+ conved = interp.do_conversion(arg_var, param_type) ||
852
893
  interp.create_tmpvar(param_type)
894
+ interp.notify_implicit_conv_performed(expr, arg_var, conved)
853
895
  else
854
- conved = arg
896
+ conved = arg_var
855
897
  end
856
898
  else
857
- conved = interp.do_default_argument_promotion(arg)
899
+ conved = interp.do_default_argument_promotion(arg_var)
900
+ if arg_var != conved
901
+ interp.notify_implicit_conv_performed(expr, arg_var, conved)
902
+ end
858
903
  end
859
904
 
860
905
  # NOTE: Value of the argument is referred when the assignment to the
861
906
  # parameter is performed.
862
- if arg.variable? && !arg.type.array?
863
- interp.notify_variable_value_referred(expr, arg)
864
- end
865
-
866
- if conved && arg != conved
867
- interp.notify_implicit_conv_performed(expr, arg, conved)
868
- end
907
+ interp.notify_variable_value_referred(expr, arg_var)
869
908
  end
870
909
  end
871
910
 
@@ -1045,6 +1084,10 @@ module Cc1 #:nodoc:
1045
1084
  end
1046
1085
  nil
1047
1086
  end
1087
+
1088
+ def designators
1089
+ @functions.map { |hash| hash.keys }.flatten.to_set
1090
+ end
1048
1091
  end
1049
1092
 
1050
1093
  class Memory