adlint 3.0.4 → 3.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +374 -13
- data/INSTALL +1 -3
- data/MANIFEST +12 -0
- data/NEWS +30 -4
- data/README +0 -4
- data/TODO +2 -1
- data/etc/mesg.d/c_builtin/en_US/messages.yml +2 -2
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +2 -2
- data/etc/mesg.d/core/en_US/messages.yml +5 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +5 -1
- data/features/code_check/W0422.feature +128 -0
- data/features/code_check/W0491.feature +57 -0
- data/features/code_check/W0492.feature +80 -0
- data/features/code_check/W0542.feature +20 -0
- data/features/code_check/W0580.feature +25 -0
- data/features/code_check/W0610.feature +36 -0
- data/features/code_check/W0642.feature +67 -0
- data/features/code_check/W0786.feature +39 -0
- data/features/code_check/W0830.feature +27 -0
- data/features/code_check/W1047.feature +72 -0
- data/features/code_check/W9003.feature +22 -0
- data/features/code_extraction/TODO +1 -0
- data/features/metric_measurement/TODO +1 -0
- data/lib/adlint/analyzer.rb +2 -2
- data/lib/adlint/cc1/ctrlexpr.rb +27 -6
- data/lib/adlint/cc1/domain.rb +72 -12
- data/lib/adlint/cc1/enum.rb +4 -0
- data/lib/adlint/cc1/expr.rb +31 -29
- data/lib/adlint/cc1/interp.rb +45 -56
- data/lib/adlint/cc1/lexer.rb +26 -5
- data/lib/adlint/cc1/mediator.rb +35 -6
- data/lib/adlint/cc1/object.rb +62 -19
- data/lib/adlint/cc1/parser.rb +948 -904
- data/lib/adlint/cc1/parser.y +59 -29
- data/lib/adlint/cc1/phase.rb +6 -8
- data/lib/adlint/cc1/syntax.rb +70 -17
- data/lib/adlint/cc1/util.rb +4 -4
- data/lib/adlint/code.rb +16 -6
- data/lib/adlint/cpp/eval.rb +31 -25
- data/lib/adlint/cpp/lexer.rb +11 -5
- data/lib/adlint/cpp/macro.rb +34 -7
- data/lib/adlint/cpp/phase.rb +8 -8
- data/lib/adlint/error.rb +6 -0
- data/lib/adlint/exam/c_builtin/cc1_check.rb +557 -594
- data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +72 -72
- data/lib/adlint/exam/c_builtin/cc1_code.rb +72 -52
- data/lib/adlint/exam/c_builtin/cc1_metric.rb +131 -131
- data/lib/adlint/exam/c_builtin/cpp_check.rb +48 -48
- data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +2 -2
- data/lib/adlint/exam/c_builtin/cpp_code.rb +21 -21
- data/lib/adlint/exam/c_builtin/ld_check.rb +88 -87
- data/lib/adlint/exam/c_builtin/ld_metric.rb +4 -5
- data/lib/adlint/exam/c_builtin.rb +6 -6
- data/lib/adlint/ld/object.rb +269 -186
- data/lib/adlint/ld/phase.rb +19 -19
- data/lib/adlint/ld/typedef.rb +7 -7
- data/lib/adlint/ld/util.rb +25 -17
- data/lib/adlint/location.rb +6 -1
- data/lib/adlint/memo.rb +66 -13
- data/lib/adlint/prelude.rb +2 -2
- data/lib/adlint/report.rb +13 -14
- data/lib/adlint/util.rb +1 -1
- data/lib/adlint/version.rb +2 -2
- data/share/doc/Makefile +6 -2
- data/share/doc/c99gram.dot +502 -0
- data/share/doc/c99gram.pdf +0 -0
- data/share/doc/developers_guide_ja.html +4 -3
- data/share/doc/developers_guide_ja.texi +2 -1
- data/share/doc/users_guide_en.html +9 -9
- data/share/doc/users_guide_en.texi +7 -7
- data/share/doc/users_guide_ja.html +9 -9
- data/share/doc/users_guide_ja.texi +7 -7
- metadata +14 -2
data/lib/adlint/cc1/mediator.rb
CHANGED
@@ -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
|
data/lib/adlint/cc1/object.rb
CHANGED
@@ -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
|
843
|
-
conved = interp.
|
844
|
-
|
845
|
-
|
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 =
|
896
|
+
conved = arg_var
|
855
897
|
end
|
856
898
|
else
|
857
|
-
conved = interp.do_default_argument_promotion(
|
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
|
-
|
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
|