adlint 3.0.4 → 3.0.8

Sign up to get free protection for your applications and to get access to all the features.
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