adlint 1.8.10 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +261 -3
- data/MANIFEST +25 -1
- data/NEWS +25 -5
- data/Rakefile +11 -0
- data/TODO +0 -1
- data/etc/mesg.d/en_US/messages.yml +1 -1
- data/etc/mesg.d/ja_JP/messages.yml +1 -1
- data/features/message_detection/W0001.feature +41 -0
- data/features/message_detection/W0002.feature +68 -0
- data/features/message_detection/W0003.feature +134 -0
- data/features/message_detection/W0007.feature +264 -0
- data/features/message_detection/W0010.feature +75 -0
- data/features/message_detection/W0013.feature +189 -0
- data/features/message_detection/W0109.feature +50 -0
- data/features/message_detection/W0583.feature +30 -0
- data/features/message_detection/W0606.feature +20 -0
- data/features/message_detection/W0698.feature +20 -0
- data/features/message_detection/W0699.feature +21 -0
- data/features/message_detection/W0703.feature +73 -0
- data/features/message_detection/W0716.feature +67 -0
- data/features/message_detection/W0717.feature +64 -0
- data/features/message_detection/W0718.feature +64 -0
- data/features/message_detection/W0723.feature +18 -0
- data/features/message_detection/W1031.feature +328 -0
- data/features/step_definitions/message_detection_steps.rb +45 -0
- data/features/support/env.rb +58 -0
- data/lib/adlint/c/branch.rb +16 -23
- data/lib/adlint/c/code.rb +1 -12
- data/lib/adlint/c/conv.rb +4 -4
- data/lib/adlint/c/ctrlexpr.rb +10 -6
- data/lib/adlint/c/domain.rb +2 -2
- data/lib/adlint/c/expr.rb +11 -33
- data/lib/adlint/c/format.rb +6 -6
- data/lib/adlint/c/interp.rb +137 -80
- data/lib/adlint/c/mediator.rb +5 -2
- data/lib/adlint/c/message.rb +123 -140
- data/lib/adlint/c/message_shima.rb +44 -0
- data/lib/adlint/c/object.rb +93 -26
- data/lib/adlint/c/option.rb +53 -0
- data/lib/adlint/c/phase.rb +4 -1
- data/lib/adlint/c/type.rb +112 -46
- data/lib/adlint/c.rb +1 -0
- data/lib/adlint/version.rb +3 -3
- data/share/doc/developers_guide_ja.html +3 -3
- data/share/doc/developers_guide_ja.texi +1 -1
- data/share/doc/users_guide_en.html +35 -28
- data/share/doc/users_guide_en.texi +30 -22
- data/share/doc/users_guide_ja.html +35 -31
- data/share/doc/users_guide_ja.texi +30 -24
- data/spec/adlint/c/type_spec.rb +110 -0
- data/spec/conf.d/default_traits.yml +216 -0
- data/spec/conf.d/empty_cinit.h +11 -0
- data/spec/conf.d/empty_pinit.h +11 -0
- data/spec/spec_helper.rb +49 -0
- metadata +27 -3
- data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
data/lib/adlint/c/message.rb
CHANGED
@@ -35,6 +35,7 @@ require "adlint/traits"
|
|
35
35
|
require "adlint/monitor"
|
36
36
|
require "adlint/c/syntax"
|
37
37
|
require "adlint/c/format"
|
38
|
+
require "adlint/c/option"
|
38
39
|
require "adlint/c/util"
|
39
40
|
require "adlint/cpp/syntax"
|
40
41
|
|
@@ -659,8 +660,8 @@ module C #:nodoc:
|
|
659
660
|
end
|
660
661
|
end
|
661
662
|
|
662
|
-
def check_conditional(conditional_expression,
|
663
|
-
unless
|
663
|
+
def check_conditional(conditional_expression, controlling_variable, result)
|
664
|
+
unless controlling_variable.type.scalar?
|
664
665
|
W(:W0035, conditional_expression.location)
|
665
666
|
end
|
666
667
|
end
|
@@ -1160,7 +1161,7 @@ module C #:nodoc:
|
|
1160
1161
|
interp.on_variable_declared += method(:add_variable)
|
1161
1162
|
interp.on_variable_defined += method(:add_variable)
|
1162
1163
|
interp.on_function_declared += method(:add_function)
|
1163
|
-
interp.
|
1164
|
+
interp.on_function_defined += method(:add_function)
|
1164
1165
|
interp.on_translation_unit_ended += method(:check)
|
1165
1166
|
@identifiers = Hash.new { |hash, key| hash[key] = [] }
|
1166
1167
|
end
|
@@ -2493,7 +2494,7 @@ module C #:nodoc:
|
|
2493
2494
|
interp = context[:c_interpreter]
|
2494
2495
|
interp.on_function_declared += method(:declare_function)
|
2495
2496
|
interp.on_variable_declared += method(:declare_variable)
|
2496
|
-
interp.
|
2497
|
+
interp.on_function_defined += method(:check_function)
|
2497
2498
|
interp.on_variable_defined += method(:check_variable)
|
2498
2499
|
@target_fpath = context[:sources].first.fpath
|
2499
2500
|
@external_symbols = Set.new
|
@@ -4108,10 +4109,10 @@ module C #:nodoc:
|
|
4108
4109
|
def check_return_statement(return_statement, result_variable)
|
4109
4110
|
return unless @current_function
|
4110
4111
|
return if from_type == to_type
|
4111
|
-
|
4112
4112
|
return unless result_variable
|
4113
|
-
|
4114
|
-
|
4113
|
+
|
4114
|
+
if result_variable.type.same_as?(from_type) &&
|
4115
|
+
@current_function.type.return_type.same_as?(to_type)
|
4115
4116
|
W(message_id, return_statement.location, @current_function.name)
|
4116
4117
|
end
|
4117
4118
|
end
|
@@ -6868,7 +6869,7 @@ module C #:nodoc:
|
|
6868
6869
|
super
|
6869
6870
|
interp = context[:c_interpreter]
|
6870
6871
|
interp.on_variable_defined += method(:check_variable)
|
6871
|
-
interp.
|
6872
|
+
interp.on_function_defined += method(:check_function)
|
6872
6873
|
@target_fpath = context[:sources].first.fpath
|
6873
6874
|
end
|
6874
6875
|
|
@@ -8654,6 +8655,12 @@ module C #:nodoc:
|
|
8654
8655
|
@group_depth -= 1
|
8655
8656
|
end
|
8656
8657
|
|
8658
|
+
def visit_conditional_expression(node)
|
8659
|
+
@group_depth += 1
|
8660
|
+
super
|
8661
|
+
@group_depth -= 1
|
8662
|
+
end
|
8663
|
+
|
8657
8664
|
def visit_array_subscript_expression(node)
|
8658
8665
|
AmbiguousExpressionDetector.new(@context, node.array_subscript).execute
|
8659
8666
|
end
|
@@ -8785,6 +8792,7 @@ module C #:nodoc:
|
|
8785
8792
|
def initialize(context, expression)
|
8786
8793
|
@context = context
|
8787
8794
|
@expression = expression
|
8795
|
+
@already_warned = false
|
8788
8796
|
@group_depth = 0
|
8789
8797
|
@ungrouped_binary_expr = 0
|
8790
8798
|
end
|
@@ -8800,61 +8808,73 @@ module C #:nodoc:
|
|
8800
8808
|
end
|
8801
8809
|
|
8802
8810
|
def visit_multiplicative_expression(node)
|
8803
|
-
|
8811
|
+
check_binary_expression
|
8812
|
+
super
|
8804
8813
|
end
|
8805
8814
|
|
8806
8815
|
def visit_additive_expression(node)
|
8807
|
-
|
8816
|
+
check_binary_expression
|
8817
|
+
super
|
8808
8818
|
end
|
8809
8819
|
|
8810
8820
|
def visit_shift_expression(node)
|
8811
|
-
|
8821
|
+
check_binary_expression
|
8822
|
+
super
|
8812
8823
|
end
|
8813
8824
|
|
8814
8825
|
def visit_relational_expression(node)
|
8815
|
-
|
8826
|
+
check_binary_expression
|
8827
|
+
super
|
8816
8828
|
end
|
8817
8829
|
|
8818
8830
|
def visit_equality_expression(node)
|
8819
|
-
|
8831
|
+
check_binary_expression
|
8832
|
+
super
|
8820
8833
|
end
|
8821
8834
|
|
8822
8835
|
def visit_and_expression(node)
|
8823
|
-
|
8836
|
+
check_binary_expression
|
8837
|
+
super
|
8824
8838
|
end
|
8825
8839
|
|
8826
8840
|
def visit_exclusive_or_expression(node)
|
8827
|
-
|
8841
|
+
check_binary_expression
|
8842
|
+
super
|
8828
8843
|
end
|
8829
8844
|
|
8830
8845
|
def visit_inclusive_or_expression(node)
|
8831
|
-
|
8846
|
+
check_binary_expression
|
8847
|
+
super
|
8832
8848
|
end
|
8833
8849
|
|
8834
8850
|
def visit_logical_and_expression(node)
|
8835
|
-
|
8851
|
+
check_binary_expression
|
8852
|
+
super
|
8836
8853
|
end
|
8837
8854
|
|
8838
8855
|
def visit_logical_or_expression(node)
|
8839
|
-
|
8856
|
+
check_binary_expression
|
8857
|
+
super
|
8840
8858
|
end
|
8841
8859
|
|
8842
8860
|
def visit_simple_assignment_expression(node)
|
8843
|
-
|
8861
|
+
check_binary_expression
|
8862
|
+
super
|
8844
8863
|
end
|
8845
8864
|
|
8846
8865
|
def visit_compound_assignment_expression(node)
|
8847
|
-
|
8866
|
+
check_binary_expression
|
8867
|
+
super
|
8848
8868
|
end
|
8849
8869
|
|
8850
8870
|
private
|
8851
8871
|
def check_binary_expression
|
8852
8872
|
@ungrouped_binary_expr += 1 if @group_depth == 0
|
8853
|
-
|
8854
|
-
|
8855
|
-
|
8856
|
-
|
8857
|
-
|
8873
|
+
unless @already_warned
|
8874
|
+
if include_ambiguous_expr?
|
8875
|
+
W(:W0501, @expression.head_location)
|
8876
|
+
@already_warned = true
|
8877
|
+
end
|
8858
8878
|
end
|
8859
8879
|
end
|
8860
8880
|
|
@@ -10372,21 +10392,12 @@ module C #:nodoc:
|
|
10372
10392
|
return unless function.named?
|
10373
10393
|
return if function.type.have_va_list?
|
10374
10394
|
|
10375
|
-
param_types = function.type.parameter_types.
|
10376
|
-
type.void? ? nil : type.unqualify
|
10377
|
-
}.compact
|
10395
|
+
param_types = function.type.parameter_types.reject { |type| type.void? }
|
10378
10396
|
|
10379
10397
|
@function_calls[function.name].each do |expr, arg_types|
|
10380
10398
|
if arg_types.size == param_types.size
|
10381
10399
|
conformed = arg_types.zip(param_types).all? { |atype, ptype|
|
10382
|
-
|
10383
|
-
when atype.array? && ptype.array?,
|
10384
|
-
atype.array? && ptype.pointer?,
|
10385
|
-
atype.pointer? && ptype.array?
|
10386
|
-
atype.base_type == ptype.base_type
|
10387
|
-
else
|
10388
|
-
atype == ptype
|
10389
|
-
end
|
10400
|
+
atype.convertible?(ptype)
|
10390
10401
|
}
|
10391
10402
|
else
|
10392
10403
|
conformed = false
|
@@ -10398,7 +10409,7 @@ module C #:nodoc:
|
|
10398
10409
|
|
10399
10410
|
def call_function(expression, function, arg_variables, result_variable)
|
10400
10411
|
if function.named?
|
10401
|
-
arg_types = arg_variables.map { |var| var.type
|
10412
|
+
arg_types = arg_variables.map { |var| var.type }
|
10402
10413
|
@function_calls[function.name].push([expression, arg_types])
|
10403
10414
|
end
|
10404
10415
|
end
|
@@ -10409,7 +10420,7 @@ module C #:nodoc:
|
|
10409
10420
|
super
|
10410
10421
|
interp = context[:c_interpreter]
|
10411
10422
|
interp.on_function_call_expr_evaled += method(:call_function)
|
10412
|
-
interp.
|
10423
|
+
interp.on_function_defined += method(:check)
|
10413
10424
|
@function_calls = Hash.new { |hash, key| hash[key] = [] }
|
10414
10425
|
end
|
10415
10426
|
|
@@ -10418,21 +10429,12 @@ module C #:nodoc:
|
|
10418
10429
|
return unless function.named?
|
10419
10430
|
return if function.type.have_va_list?
|
10420
10431
|
|
10421
|
-
param_types = function.type.parameter_types.
|
10422
|
-
type.void? ? nil : type.unqualify
|
10423
|
-
}.compact
|
10432
|
+
param_types = function.type.parameter_types.reject { |type| type.void? }
|
10424
10433
|
|
10425
10434
|
@function_calls[function.name].each do |expr, arg_types|
|
10426
10435
|
if arg_types.size == param_types.size
|
10427
10436
|
conformed = arg_types.zip(param_types).all? { |atype, ptype|
|
10428
|
-
|
10429
|
-
when atype.array? && ptype.array?,
|
10430
|
-
atype.array? && ptype.pointer?,
|
10431
|
-
atype.pointer? && ptype.array?
|
10432
|
-
atype.base_type == ptype.base_type
|
10433
|
-
else
|
10434
|
-
atype == ptype
|
10435
|
-
end
|
10437
|
+
atype.convertible?(ptype)
|
10436
10438
|
}
|
10437
10439
|
else
|
10438
10440
|
conformed = false
|
@@ -10444,7 +10446,7 @@ module C #:nodoc:
|
|
10444
10446
|
|
10445
10447
|
def call_function(expression, function, arg_variables, result_variable)
|
10446
10448
|
if function.named?
|
10447
|
-
arg_types = arg_variables.map { |var| var.type
|
10449
|
+
arg_types = arg_variables.map { |var| var.type }
|
10448
10450
|
@function_calls[function.name].push([expression, arg_types])
|
10449
10451
|
end
|
10450
10452
|
end
|
@@ -10463,23 +10465,12 @@ module C #:nodoc:
|
|
10463
10465
|
return unless kandr_style_definition_of(function)
|
10464
10466
|
return if function.type.have_va_list?
|
10465
10467
|
|
10466
|
-
arg_types = arg_variables.map { |var| var.type
|
10467
|
-
param_types = function.type.parameter_types.
|
10468
|
-
type.void? ? nil : type.unqualify
|
10469
|
-
}.compact
|
10468
|
+
arg_types = arg_variables.map { |var| var.type }
|
10469
|
+
param_types = function.type.parameter_types.reject { |type| type.void? }
|
10470
10470
|
|
10471
10471
|
if arg_types.size == param_types.size
|
10472
10472
|
arg_types.zip(param_types).each_with_index do |(atype, ptype), index|
|
10473
|
-
|
10474
|
-
when atype.array? && ptype.array?,
|
10475
|
-
atype.array? && ptype.pointer?,
|
10476
|
-
atype.pointer? && ptype.array?
|
10477
|
-
atype.base_type == ptype.base_type
|
10478
|
-
else
|
10479
|
-
atype == ptype
|
10480
|
-
end
|
10481
|
-
|
10482
|
-
unless conformed
|
10473
|
+
unless atype.convertible?(ptype)
|
10483
10474
|
W(:W0584,
|
10484
10475
|
expression.argument_expressions[index].location, index + 1)
|
10485
10476
|
end
|
@@ -11132,7 +11123,7 @@ module C #:nodoc:
|
|
11132
11123
|
interp.on_variable_defined += method(:check)
|
11133
11124
|
interp.on_variable_declared += method(:check)
|
11134
11125
|
interp.on_function_declared += method(:check)
|
11135
|
-
interp.
|
11126
|
+
interp.on_function_defined += method(:check)
|
11136
11127
|
@typedef_types = {}
|
11137
11128
|
end
|
11138
11129
|
|
@@ -11245,7 +11236,7 @@ module C #:nodoc:
|
|
11245
11236
|
def initialize(context)
|
11246
11237
|
super
|
11247
11238
|
interp = context[:c_interpreter]
|
11248
|
-
interp.
|
11239
|
+
interp.on_function_defined += method(:define_function)
|
11249
11240
|
interp.on_function_referred += method(:refer_function)
|
11250
11241
|
interp.on_translation_unit_ended += method(:check)
|
11251
11242
|
@static_functions = {}
|
@@ -12166,7 +12157,7 @@ module C #:nodoc:
|
|
12166
12157
|
interp.on_variable_declared += method(:declare_variable)
|
12167
12158
|
interp.on_enum_declared += method(:declare_enum)
|
12168
12159
|
interp.on_typedef_declared += method(:declare_typedef)
|
12169
|
-
interp.
|
12160
|
+
interp.on_function_defined += method(:define_function)
|
12170
12161
|
interp.on_parameter_defined += method(:define_parameter)
|
12171
12162
|
interp.on_block_started += method(:enter_scope)
|
12172
12163
|
interp.on_block_ended += method(:leave_scope)
|
@@ -13543,7 +13534,7 @@ module C #:nodoc:
|
|
13543
13534
|
interp.on_variable_declared += method(:check_object_declaration)
|
13544
13535
|
interp.on_variable_defined += method(:check_object_declaration)
|
13545
13536
|
interp.on_function_declared += method(:check_object_declaration)
|
13546
|
-
interp.
|
13537
|
+
interp.on_function_defined += method(:check_object_declaration)
|
13547
13538
|
interp.on_typedef_declared += method(:check_typedef_declaration)
|
13548
13539
|
interp.on_enum_declared += method(:check_enum_declaration)
|
13549
13540
|
interp.on_block_started += method(:start_block)
|
@@ -13679,7 +13670,7 @@ module C #:nodoc:
|
|
13679
13670
|
interp.on_variable_declared += method(:check_object_declaration)
|
13680
13671
|
interp.on_variable_defined += method(:check_object_declaration)
|
13681
13672
|
interp.on_function_declared += method(:check_object_declaration)
|
13682
|
-
interp.
|
13673
|
+
interp.on_function_defined += method(:check_object_declaration)
|
13683
13674
|
interp.on_typedef_declared += method(:check_typedef_declaration)
|
13684
13675
|
interp.on_enum_declared += method(:check_enum_declaration)
|
13685
13676
|
interp.on_block_started += method(:start_block)
|
@@ -13813,7 +13804,7 @@ module C #:nodoc:
|
|
13813
13804
|
interp.on_variable_declared += method(:check_object_declaration)
|
13814
13805
|
interp.on_variable_defined += method(:check_object_declaration)
|
13815
13806
|
interp.on_function_declared += method(:check_object_declaration)
|
13816
|
-
interp.
|
13807
|
+
interp.on_function_defined += method(:check_object_declaration)
|
13817
13808
|
interp.on_typedef_declared += method(:check_typedef_declaration)
|
13818
13809
|
interp.on_enum_declared += method(:check_enum_declaration)
|
13819
13810
|
interp.on_block_started += method(:start_block)
|
@@ -13948,7 +13939,7 @@ module C #:nodoc:
|
|
13948
13939
|
super
|
13949
13940
|
interp = context[:c_interpreter]
|
13950
13941
|
interp.on_variable_defined += method(:check_variable)
|
13951
|
-
interp.
|
13942
|
+
interp.on_function_defined += method(:check_function)
|
13952
13943
|
interp.on_block_started += method(:enter_block)
|
13953
13944
|
interp.on_block_ended += method(:leave_block)
|
13954
13945
|
@global_var_names = Set.new
|
@@ -14344,7 +14335,7 @@ module C #:nodoc:
|
|
14344
14335
|
end
|
14345
14336
|
|
14346
14337
|
def compute_bitfield_width(expression)
|
14347
|
-
object = @c_interp.execute(expression,
|
14338
|
+
object = @c_interp.execute(expression, InterpreterOptions::QUIET)
|
14348
14339
|
if object.variable? && object.value.scalar?
|
14349
14340
|
return object.value.unique_sample || 0
|
14350
14341
|
end
|
@@ -14442,87 +14433,79 @@ module C #:nodoc:
|
|
14442
14433
|
class W1031 < PassiveMessageDetection
|
14443
14434
|
def initialize(context)
|
14444
14435
|
super
|
14445
|
-
|
14446
|
-
|
14447
|
-
|
14448
|
-
|
14449
|
-
|
14450
|
-
visitor.enter_kandr_function_definition += method(:define_function)
|
14451
|
-
visitor.enter_compound_statement += method(:enter_block)
|
14452
|
-
visitor.leave_compound_statement += method(:leave_block)
|
14453
|
-
@block_level = 0
|
14454
|
-
@global_objects = {}
|
14436
|
+
interp = context[:c_interpreter]
|
14437
|
+
interp.on_variable_declared += method(:declare_variable)
|
14438
|
+
interp.on_variable_defined += method(:define_variable)
|
14439
|
+
interp.on_function_declared += method(:declare_function)
|
14440
|
+
interp.on_function_defined += method(:define_function)
|
14455
14441
|
end
|
14456
14442
|
|
14457
14443
|
private
|
14458
|
-
def declare_variable(variable_declaration)
|
14459
|
-
|
14460
|
-
|
14461
|
-
|
14462
|
-
|
14463
|
-
|
14464
|
-
|
14465
|
-
|
14466
|
-
|
14467
|
-
|
14468
|
-
|
14469
|
-
|
14470
|
-
|
14471
|
-
|
14472
|
-
linkage = linkage_of(variable_definition)
|
14473
|
-
prev_linkage = @global_objects[name]
|
14474
|
-
case
|
14475
|
-
when linkage && prev_linkage && linkage != prev_linkage
|
14476
|
-
W(:W1031, variable_definition.location, name)
|
14477
|
-
when linkage
|
14478
|
-
@global_objects[name] = linkage
|
14444
|
+
def declare_variable(variable_declaration, variable)
|
14445
|
+
if variable.named?
|
14446
|
+
case
|
14447
|
+
when variable.declared_as_extern?
|
14448
|
+
sc_specifier = variable_declaration.storage_class_specifier
|
14449
|
+
if sc_specifier && sc_specifier.type == :STATIC
|
14450
|
+
W(:W1031, variable_declaration.location, variable.name)
|
14451
|
+
end
|
14452
|
+
when variable.declared_as_static?
|
14453
|
+
sc_specifier = variable_declaration.storage_class_specifier
|
14454
|
+
if sc_specifier && sc_specifier.type == :EXTERN
|
14455
|
+
W(:W1031, variable_declaration.location, variable.name)
|
14456
|
+
end
|
14457
|
+
end
|
14479
14458
|
end
|
14480
14459
|
end
|
14481
14460
|
|
14482
|
-
def
|
14483
|
-
|
14484
|
-
|
14485
|
-
|
14486
|
-
|
14487
|
-
|
14488
|
-
|
14489
|
-
|
14490
|
-
|
14461
|
+
def define_variable(variable_definition, variable)
|
14462
|
+
if variable.named?
|
14463
|
+
case
|
14464
|
+
when variable.declared_as_extern?
|
14465
|
+
sc_specifier = variable_definition.storage_class_specifier
|
14466
|
+
if sc_specifier && sc_specifier.type == :STATIC
|
14467
|
+
W(:W1031, variable_definition.location, variable.name)
|
14468
|
+
end
|
14469
|
+
when variable.declared_as_static?
|
14470
|
+
sc_specifier = variable_definition.storage_class_specifier
|
14471
|
+
if sc_specifier && sc_specifier.type == :EXTERN
|
14472
|
+
W(:W1031, variable_definition.location, variable.name)
|
14473
|
+
end
|
14474
|
+
end
|
14491
14475
|
end
|
14492
14476
|
end
|
14493
14477
|
|
14494
|
-
def
|
14495
|
-
|
14496
|
-
|
14497
|
-
|
14498
|
-
|
14499
|
-
|
14500
|
-
|
14501
|
-
|
14502
|
-
|
14478
|
+
def declare_function(function_declaration, function)
|
14479
|
+
if function.named?
|
14480
|
+
case
|
14481
|
+
when function.declared_as_extern?
|
14482
|
+
sc_specifier = function_declaration.storage_class_specifier
|
14483
|
+
if sc_specifier && sc_specifier.type == :STATIC
|
14484
|
+
W(:W1031, function_declaration.location, function.name)
|
14485
|
+
end
|
14486
|
+
when function.declared_as_static?
|
14487
|
+
sc_specifier = function_declaration.storage_class_specifier
|
14488
|
+
if sc_specifier && sc_specifier.type == :EXTERN
|
14489
|
+
W(:W1031, function_declaration.location, function.name)
|
14490
|
+
end
|
14491
|
+
end
|
14503
14492
|
end
|
14504
14493
|
end
|
14505
14494
|
|
14506
|
-
def
|
14507
|
-
|
14508
|
-
|
14509
|
-
|
14510
|
-
|
14511
|
-
|
14512
|
-
|
14513
|
-
|
14514
|
-
|
14515
|
-
|
14516
|
-
|
14517
|
-
|
14518
|
-
|
14519
|
-
when :EXTERN
|
14520
|
-
:external
|
14521
|
-
else
|
14522
|
-
nil
|
14495
|
+
def define_function(function_definition, function)
|
14496
|
+
if function.named?
|
14497
|
+
case
|
14498
|
+
when function.declared_as_extern?
|
14499
|
+
sc_specifier = function_definition.storage_class_specifier
|
14500
|
+
if sc_specifier && sc_specifier.type == :STATIC
|
14501
|
+
W(:W1031, function_definition.location, function.name)
|
14502
|
+
end
|
14503
|
+
when function.declared_as_static?
|
14504
|
+
sc_specifier = function_definition.storage_class_specifier
|
14505
|
+
if sc_specifier && sc_specifier.type == :EXTERN
|
14506
|
+
W(:W1031, function_definition.location, function.name)
|
14507
|
+
end
|
14523
14508
|
end
|
14524
|
-
else
|
14525
|
-
@block_level == 0 ? :external : nil
|
14526
14509
|
end
|
14527
14510
|
end
|
14528
14511
|
end
|
@@ -250,6 +250,50 @@ module C #:nodoc:
|
|
250
250
|
end
|
251
251
|
end
|
252
252
|
|
253
|
+
class W0716 < PassiveMessageDetection
|
254
|
+
def initialize(context)
|
255
|
+
super
|
256
|
+
visitor = context[:c_visitor]
|
257
|
+
visitor.enter_additive_expression += method(:check)
|
258
|
+
visitor.enter_multiplicative_expression += method(:check)
|
259
|
+
visitor.enter_shift_expression += method(:check)
|
260
|
+
visitor.enter_and_expression += method(:check)
|
261
|
+
visitor.enter_exclusive_or_expression += method(:check)
|
262
|
+
visitor.enter_inclusive_or_expression += method(:check)
|
263
|
+
visitor.enter_compound_assignment_expression += lambda { |expr|
|
264
|
+
case expr.operator.type
|
265
|
+
when "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "^=", "|="
|
266
|
+
check(expr)
|
267
|
+
end
|
268
|
+
}
|
269
|
+
end
|
270
|
+
|
271
|
+
private
|
272
|
+
def check(expression)
|
273
|
+
if expression.lhs_operand.logical? && expression.rhs_operand.logical?
|
274
|
+
W(:W0716, expression.location)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
class W0717 < W0716
|
280
|
+
private
|
281
|
+
def check(expression)
|
282
|
+
if expression.lhs_operand.logical? && !expression.rhs_operand.logical?
|
283
|
+
W(:W0717, expression.lhs_operand.location)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
class W0718 < W0716
|
289
|
+
private
|
290
|
+
def check(expression)
|
291
|
+
if !expression.lhs_operand.logical? && expression.rhs_operand.logical?
|
292
|
+
W(:W0718, expression.rhs_operand.location)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
253
297
|
class W0726 < W0698
|
254
298
|
private
|
255
299
|
def check(return_statement)
|