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.
- 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
|