adlint 2.6.0 → 2.6.2
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 +122 -0
- data/MANIFEST +1 -0
- data/NEWS +23 -4
- data/README +1 -1
- data/Rakefile +1 -1
- data/etc/mesg.d/c_builtin/en_US/messages.yml +8 -8
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +8 -8
- data/etc/mesg.d/core/en_US/messages.yml +1 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
- data/features/code_check/W0599.feature +71 -0
- data/lib/adlint/c/builtin.rb +1 -1
- data/lib/adlint/c/const.rb +60 -60
- data/lib/adlint/c/conv.rb +3 -3
- data/lib/adlint/c/ctrlexpr.rb +278 -357
- data/lib/adlint/c/expr.rb +1232 -1637
- data/lib/adlint/c/format.rb +26 -26
- data/lib/adlint/c/interp.rb +339 -391
- data/lib/adlint/c/mediator.rb +1 -2
- data/lib/adlint/c/object.rb +8 -9
- data/lib/adlint/c/seqp.rb +1 -1
- data/lib/adlint/c/syntax.rb +6 -6
- data/lib/adlint/c/type.rb +8 -8
- data/lib/adlint/cpp/eval.rb +1 -1
- data/lib/adlint/cpp/macro.rb +4 -4
- data/lib/adlint/cpp/util.rb +1 -1
- data/lib/adlint/exam/c_builtin/c_check.rb +93 -95
- data/lib/adlint/exam/c_builtin/ld_check.rb +4 -4
- data/lib/adlint/traits.rb +7 -16
- data/lib/adlint/util.rb +12 -0
- data/lib/adlint/version.rb +2 -2
- 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 +32 -32
- data/share/doc/users_guide_en.texi +30 -30
- data/share/doc/users_guide_ja.html +32 -32
- data/share/doc/users_guide_ja.texi +30 -30
- metadata +4 -3
data/lib/adlint/c/mediator.rb
CHANGED
@@ -114,8 +114,7 @@ module C #:nodoc:
|
|
114
114
|
}
|
115
115
|
end
|
116
116
|
|
117
|
-
def
|
118
|
-
value = type.undefined_value)
|
117
|
+
def create_tempvar(type = undeclared_type, value = type.undefined_value)
|
119
118
|
variable_table.define_temporary(type, value)
|
120
119
|
end
|
121
120
|
|
data/lib/adlint/c/object.rb
CHANGED
@@ -687,7 +687,7 @@ module C #:nodoc:
|
|
687
687
|
end
|
688
688
|
|
689
689
|
def storage_duration_of(declaration_or_definition)
|
690
|
-
# NOTE: The ISO C99 standard
|
690
|
+
# NOTE: The ISO C99 standard says;
|
691
691
|
#
|
692
692
|
# 6.2.2 Linkages of identifiers
|
693
693
|
#
|
@@ -835,10 +835,10 @@ module C #:nodoc:
|
|
835
835
|
return_values_via_pointer_arguments(interpreter, funcall_expr, args)
|
836
836
|
|
837
837
|
if type.return_type.function?
|
838
|
-
interpreter.
|
838
|
+
interpreter.create_tempvar
|
839
839
|
else
|
840
|
-
|
841
|
-
|
840
|
+
return_type = type.return_type
|
841
|
+
interpreter.create_tempvar(return_type, return_type.return_value)
|
842
842
|
end
|
843
843
|
end
|
844
844
|
|
@@ -853,16 +853,15 @@ module C #:nodoc:
|
|
853
853
|
case
|
854
854
|
when arg.type.array? && param_type.pointer?
|
855
855
|
arg_value = interpreter.pointer_value_of(arg)
|
856
|
-
converted = interpreter.
|
856
|
+
converted = interpreter.create_tempvar(param_type, arg_value)
|
857
857
|
when arg.type.pointer? && param_type.array?
|
858
858
|
converted = interpreter.pointee_of(arg)
|
859
859
|
when arg.type.function? && param_type.pointer?
|
860
860
|
arg_value = interpreter.pointer_value_of(arg)
|
861
|
-
converted = interpreter.
|
861
|
+
converted = interpreter.create_tempvar(param_type, arg_value)
|
862
862
|
when arg.variable? && !arg.type.same_as?(param_type)
|
863
|
-
converted =
|
864
|
-
|
865
|
-
interpreter.temporary_variable(param_type)
|
863
|
+
converted = interpreter.do_conversion(arg, param_type) ||
|
864
|
+
interpreter.create_tempvar(param_type)
|
866
865
|
else
|
867
866
|
converted = arg
|
868
867
|
end
|
data/lib/adlint/c/seqp.rb
CHANGED
data/lib/adlint/c/syntax.rb
CHANGED
@@ -445,7 +445,7 @@ module C #:nodoc:
|
|
445
445
|
def full=(full_expression)
|
446
446
|
@full = full_expression
|
447
447
|
|
448
|
-
# NOTE: The ISO C99 standard
|
448
|
+
# NOTE: The ISO C99 standard says;
|
449
449
|
#
|
450
450
|
# Annex C (informative) Sequence points
|
451
451
|
#
|
@@ -1944,7 +1944,7 @@ module C #:nodoc:
|
|
1944
1944
|
def initialize(operator, lhs_operand, rhs_operand)
|
1945
1945
|
super
|
1946
1946
|
|
1947
|
-
# NOTE: The ISO C99 standard
|
1947
|
+
# NOTE: The ISO C99 standard says;
|
1948
1948
|
#
|
1949
1949
|
# 6.5.13 Logical AND operator
|
1950
1950
|
#
|
@@ -1993,7 +1993,7 @@ module C #:nodoc:
|
|
1993
1993
|
def initialize(operator, lhs_operand, rhs_operand)
|
1994
1994
|
super
|
1995
1995
|
|
1996
|
-
# NOTE: The ISO C99 standard
|
1996
|
+
# NOTE: The ISO C99 standard says;
|
1997
1997
|
#
|
1998
1998
|
# 6.5.14 Logical OR operator
|
1999
1999
|
#
|
@@ -2046,7 +2046,7 @@ module C #:nodoc:
|
|
2046
2046
|
@else_expression = else_expression
|
2047
2047
|
@question_mark = question_mark
|
2048
2048
|
|
2049
|
-
# NOTE: The ISO C99 standard
|
2049
|
+
# NOTE: The ISO C99 standard says;
|
2050
2050
|
#
|
2051
2051
|
# 6.5.15 Conditional operator
|
2052
2052
|
#
|
@@ -2232,7 +2232,7 @@ module C #:nodoc:
|
|
2232
2232
|
def push(expression)
|
2233
2233
|
@expressions.push(expression)
|
2234
2234
|
|
2235
|
-
# NOTE: The ISO C99 standard
|
2235
|
+
# NOTE: The ISO C99 standard says;
|
2236
2236
|
#
|
2237
2237
|
# 6.5.17 Comma operator
|
2238
2238
|
#
|
@@ -3055,7 +3055,7 @@ module C #:nodoc:
|
|
3055
3055
|
def full=(full_declarator)
|
3056
3056
|
@full = full_declarator
|
3057
3057
|
|
3058
|
-
# NOTE: The ISO C99 standard
|
3058
|
+
# NOTE: The ISO C99 standard says;
|
3059
3059
|
#
|
3060
3060
|
# 6.7.5 Declarators
|
3061
3061
|
#
|
data/lib/adlint/c/type.rb
CHANGED
@@ -3475,7 +3475,7 @@ module C #:nodoc:
|
|
3475
3475
|
end
|
3476
3476
|
|
3477
3477
|
def integer_promoted_type
|
3478
|
-
# NOTE: The ISO C99 standard
|
3478
|
+
# NOTE: The ISO C99 standard says;
|
3479
3479
|
#
|
3480
3480
|
# 6.3.1 Arithmetic operands
|
3481
3481
|
# 6.3.1.1 Boolean, characters, and integers
|
@@ -3500,7 +3500,7 @@ module C #:nodoc:
|
|
3500
3500
|
end
|
3501
3501
|
|
3502
3502
|
def argument_promoted_type
|
3503
|
-
# NOTE: The ISO C99 standard
|
3503
|
+
# NOTE: The ISO C99 standard says;
|
3504
3504
|
#
|
3505
3505
|
# 6.5.2.2 Function calls
|
3506
3506
|
#
|
@@ -3609,7 +3609,7 @@ module C #:nodoc:
|
|
3609
3609
|
end
|
3610
3610
|
|
3611
3611
|
def integer_conversion_rank
|
3612
|
-
# NOTE: The ISO C99 standard
|
3612
|
+
# NOTE: The ISO C99 standard says;
|
3613
3613
|
#
|
3614
3614
|
# 6.3.1 Arithmetic operands
|
3615
3615
|
# 6.3.1.1 Boolean, characters, and integers
|
@@ -4851,7 +4851,7 @@ module C #:nodoc:
|
|
4851
4851
|
|
4852
4852
|
def integer_promoted_type
|
4853
4853
|
# TODO: Should support the C99 _Bool type.
|
4854
|
-
# NOTE: The ISO C99 standard
|
4854
|
+
# NOTE: The ISO C99 standard says;
|
4855
4855
|
#
|
4856
4856
|
# 6.3.1 Arithmetic operands
|
4857
4857
|
# 6.3.1.1 Boolean, characters, and integers
|
@@ -4960,7 +4960,7 @@ module C #:nodoc:
|
|
4960
4960
|
end
|
4961
4961
|
|
4962
4962
|
def integer_conversion_rank
|
4963
|
-
# NOTE: The ISO C99 standard
|
4963
|
+
# NOTE: The ISO C99 standard says;
|
4964
4964
|
#
|
4965
4965
|
# 6.3.1 Arithmetic operands
|
4966
4966
|
# 6.3.1.1 Boolean, characters, and integers
|
@@ -5347,7 +5347,7 @@ module C #:nodoc:
|
|
5347
5347
|
end
|
5348
5348
|
|
5349
5349
|
def argument_promoted_type
|
5350
|
-
# NOTE: The ISO C99 standard
|
5350
|
+
# NOTE: The ISO C99 standard says;
|
5351
5351
|
#
|
5352
5352
|
# 6.5.2.2 Function calls
|
5353
5353
|
#
|
@@ -5728,7 +5728,7 @@ module C #:nodoc:
|
|
5728
5728
|
end
|
5729
5729
|
|
5730
5730
|
def coerce_array_value(value)
|
5731
|
-
# NOTE: The ISO C99 standard
|
5731
|
+
# NOTE: The ISO C99 standard says;
|
5732
5732
|
#
|
5733
5733
|
# 6.7.8 Initialization
|
5734
5734
|
#
|
@@ -7051,7 +7051,7 @@ module C #:nodoc:
|
|
7051
7051
|
end
|
7052
7052
|
|
7053
7053
|
def integer_conversion_rank
|
7054
|
-
# NOTE: The ISO C99 standard
|
7054
|
+
# NOTE: The ISO C99 standard says;
|
7055
7055
|
#
|
7056
7056
|
# 6.3.1 Arithmetic operands
|
7057
7057
|
# 6.3.1.1 Boolean, characters, and integers
|
data/lib/adlint/cpp/eval.rb
CHANGED
data/lib/adlint/cpp/macro.rb
CHANGED
@@ -237,7 +237,7 @@ module Cpp #:nodoc:
|
|
237
237
|
|
238
238
|
def substitute_argument(param_token, next_token, arg, location, result,
|
239
239
|
macro_table, context)
|
240
|
-
# NOTE: The ISO C99 standard
|
240
|
+
# NOTE: The ISO C99 standard says;
|
241
241
|
#
|
242
242
|
# 6.10.3.1 Argument substitution
|
243
243
|
#
|
@@ -263,7 +263,7 @@ module Cpp #:nodoc:
|
|
263
263
|
end
|
264
264
|
|
265
265
|
def stringize_argument(arg, expansion_location, macro_table)
|
266
|
-
# NOTE: The ISO C99 standard
|
266
|
+
# NOTE: The ISO C99 standard says;
|
267
267
|
#
|
268
268
|
# 6.10.3.2 The # operator
|
269
269
|
#
|
@@ -310,7 +310,7 @@ module Cpp #:nodoc:
|
|
310
310
|
|
311
311
|
def concat_with_last_token(arg_tokens, expansion_location, result_tokens,
|
312
312
|
macro_table)
|
313
|
-
# NOTE: The ISO C99 standard
|
313
|
+
# NOTE: The ISO C99 standard says;
|
314
314
|
#
|
315
315
|
# 6.10.3.3 The ## operator
|
316
316
|
#
|
@@ -634,7 +634,7 @@ module Cpp #:nodoc:
|
|
634
634
|
expanded = macro.expand(tokens[index, size], self, context)
|
635
635
|
context.add_to_hide_set(tokens[index], expanded, macro.name.value)
|
636
636
|
|
637
|
-
# NOTE: The ISO C99 standard
|
637
|
+
# NOTE: The ISO C99 standard says;
|
638
638
|
#
|
639
639
|
# 6.10.3.4 Rescanning and further replacement
|
640
640
|
#
|
data/lib/adlint/cpp/util.rb
CHANGED
@@ -1695,15 +1695,19 @@ module CBuiltin #:nodoc:
|
|
1695
1695
|
end
|
1696
1696
|
|
1697
1697
|
private
|
1698
|
-
def check(
|
1699
|
-
if
|
1700
|
-
if
|
1701
|
-
|
1702
|
-
operand_variable.type.bitfield?
|
1703
|
-
W(:W0082, unary_arithmetic_expression.location)
|
1698
|
+
def check(unary_arith_expr, operand_var, *)
|
1699
|
+
if unary_arith_expr.operator.type == "-"
|
1700
|
+
if unsigned_underlying_type?(operand_var.type)
|
1701
|
+
W(:W0082, unary_arith_expr.location, operand_var.type.brief_image)
|
1704
1702
|
end
|
1705
1703
|
end
|
1706
1704
|
end
|
1705
|
+
|
1706
|
+
def unsigned_underlying_type?(type)
|
1707
|
+
type.same_as?(@interp.unsigned_char_type) ||
|
1708
|
+
type.same_as?(@interp.unsigned_short_type) ||
|
1709
|
+
type.bitfield?
|
1710
|
+
end
|
1707
1711
|
end
|
1708
1712
|
|
1709
1713
|
class W0084 < PassiveCodeCheck
|
@@ -11243,51 +11247,48 @@ module CBuiltin #:nodoc:
|
|
11243
11247
|
end
|
11244
11248
|
|
11245
11249
|
private
|
11246
|
-
def check(
|
11250
|
+
def check(init_or_expr, src_var, dst_var)
|
11247
11251
|
return unless @rvalues
|
11248
|
-
return unless original_variable.type.integer?
|
11249
11252
|
|
11250
|
-
src_type =
|
11251
|
-
dst_type =
|
11253
|
+
src_type = src_var.type
|
11254
|
+
dst_type = dst_var.type
|
11255
|
+
return unless src_type.integer?
|
11252
11256
|
|
11253
11257
|
if src_type.integer_conversion_rank < dst_type.integer_conversion_rank
|
11254
|
-
case @rvalues[
|
11258
|
+
case @rvalues[src_var]
|
11255
11259
|
when C::UnaryArithmeticExpression, C::ShiftExpression,
|
11256
11260
|
C::AdditiveExpression, C::MultiplicativeExpression
|
11257
|
-
W(:W0578,
|
11261
|
+
W(:W0578, init_or_expr.location,
|
11262
|
+
src_type.brief_image, dst_type.brief_image)
|
11258
11263
|
end
|
11259
11264
|
end
|
11260
11265
|
end
|
11261
11266
|
|
11262
|
-
def clear_rvalues(
|
11267
|
+
def clear_rvalues(*)
|
11263
11268
|
@rvalues = {}
|
11264
11269
|
end
|
11265
11270
|
|
11266
|
-
def handle_unary(
|
11267
|
-
|
11268
|
-
|
11269
|
-
memorize_rvalue_derivation(result_variable, unary_arithmetic_expression)
|
11271
|
+
def handle_unary(unary_arith_expr, *, result_var)
|
11272
|
+
return unless unary_arith_expr.operator == "~"
|
11273
|
+
memorize_rvalue_derivation(result_var, unary_arith_expr)
|
11270
11274
|
end
|
11271
11275
|
|
11272
|
-
def handle_shift(
|
11273
|
-
|
11274
|
-
|
11275
|
-
memorize_rvalue_derivation(result_variable, shift_expression)
|
11276
|
+
def handle_shift(shift_expr, *, result_var)
|
11277
|
+
return unless shift_expr.operator.type == "<<"
|
11278
|
+
memorize_rvalue_derivation(result_var, shift_expr)
|
11276
11279
|
end
|
11277
11280
|
|
11278
|
-
def handle_additive(
|
11279
|
-
|
11280
|
-
memorize_rvalue_derivation(result_variable, additive_expression)
|
11281
|
+
def handle_additive(additive_expr, *, result_var)
|
11282
|
+
memorize_rvalue_derivation(result_var, additive_expr)
|
11281
11283
|
end
|
11282
11284
|
|
11283
|
-
def handle_multiplicative(
|
11284
|
-
|
11285
|
-
|
11286
|
-
memorize_rvalue_derivation(result_variable, multiplicative_expression)
|
11285
|
+
def handle_multiplicative(multiplicative_expr, *, result_var)
|
11286
|
+
return if multiplicative_expr.operator.type == "%"
|
11287
|
+
memorize_rvalue_derivation(result_var, multiplicative_expr)
|
11287
11288
|
end
|
11288
11289
|
|
11289
|
-
def memorize_rvalue_derivation(rvalue_holder,
|
11290
|
-
@rvalues[rvalue_holder] =
|
11290
|
+
def memorize_rvalue_derivation(rvalue_holder, expr)
|
11291
|
+
@rvalues[rvalue_holder] = expr if @rvalues
|
11291
11292
|
end
|
11292
11293
|
end
|
11293
11294
|
|
@@ -11307,51 +11308,48 @@ module CBuiltin #:nodoc:
|
|
11307
11308
|
end
|
11308
11309
|
|
11309
11310
|
private
|
11310
|
-
def check(
|
11311
|
+
def check(cast_expr, src_var, dst_var)
|
11311
11312
|
return unless @rvalues
|
11312
|
-
return unless original_variable.type.integer?
|
11313
11313
|
|
11314
|
-
src_type =
|
11315
|
-
dst_type =
|
11314
|
+
src_type = src_var.type
|
11315
|
+
dst_type = dst_var.type
|
11316
|
+
return unless src_type.integer?
|
11316
11317
|
|
11317
11318
|
if src_type.integer_conversion_rank < dst_type.integer_conversion_rank
|
11318
|
-
case @rvalues[
|
11319
|
+
case @rvalues[src_var]
|
11319
11320
|
when C::UnaryArithmeticExpression, C::ShiftExpression,
|
11320
11321
|
C::AdditiveExpression, C::MultiplicativeExpression
|
11321
|
-
W(:W0579,
|
11322
|
+
W(:W0579, cast_expr.location,
|
11323
|
+
src_type.brief_image, dst_type.brief_image)
|
11322
11324
|
end
|
11323
11325
|
end
|
11324
11326
|
end
|
11325
11327
|
|
11326
|
-
def clear_rvalues(
|
11328
|
+
def clear_rvalues(*)
|
11327
11329
|
@rvalues = {}
|
11328
11330
|
end
|
11329
11331
|
|
11330
|
-
def handle_unary(
|
11331
|
-
|
11332
|
-
|
11333
|
-
memorize_rvalue_derivation(result_variable, unary_arithmetic_expression)
|
11332
|
+
def handle_unary(unary_arith_expr, *, result_var)
|
11333
|
+
return unless unary_arith_expr.operator == "~"
|
11334
|
+
memorize_rvalue_derivation(result_var, unary_arith_expr)
|
11334
11335
|
end
|
11335
11336
|
|
11336
|
-
def handle_shift(
|
11337
|
-
|
11338
|
-
|
11339
|
-
memorize_rvalue_derivation(result_variable, shift_expression)
|
11337
|
+
def handle_shift(shift_expr, *, result_var)
|
11338
|
+
return unless shift_expr.operator.type == "<<"
|
11339
|
+
memorize_rvalue_derivation(result_var, shift_expr)
|
11340
11340
|
end
|
11341
11341
|
|
11342
|
-
def handle_additive(
|
11343
|
-
|
11344
|
-
memorize_rvalue_derivation(result_variable, additive_expression)
|
11342
|
+
def handle_additive(additive_expr, *, result_var)
|
11343
|
+
memorize_rvalue_derivation(result_var, additive_expr)
|
11345
11344
|
end
|
11346
11345
|
|
11347
|
-
def handle_multiplicative(
|
11348
|
-
|
11349
|
-
|
11350
|
-
memorize_rvalue_derivation(result_variable, multiplicative_expression)
|
11346
|
+
def handle_multiplicative(multiplicative_expr, *, result_var)
|
11347
|
+
return if multiplicative_expr.operator.type == "%"
|
11348
|
+
memorize_rvalue_derivation(result_var, multiplicative_expr)
|
11351
11349
|
end
|
11352
11350
|
|
11353
|
-
def memorize_rvalue_derivation(rvalue_holder,
|
11354
|
-
@rvalues[rvalue_holder] =
|
11351
|
+
def memorize_rvalue_derivation(rvalue_holder, expr)
|
11352
|
+
@rvalues[rvalue_holder] = expr if @rvalues
|
11355
11353
|
end
|
11356
11354
|
end
|
11357
11355
|
|
@@ -11781,7 +11779,9 @@ module CBuiltin #:nodoc:
|
|
11781
11779
|
end
|
11782
11780
|
|
11783
11781
|
def refer_variable(expression, variable)
|
11784
|
-
|
11782
|
+
if variable.named?
|
11783
|
+
@refer_count[variable] += 1
|
11784
|
+
end
|
11785
11785
|
end
|
11786
11786
|
|
11787
11787
|
def update_variable(expression, variable)
|
@@ -12899,13 +12899,13 @@ module CBuiltin #:nodoc:
|
|
12899
12899
|
end
|
12900
12900
|
|
12901
12901
|
private
|
12902
|
-
def check(expr,
|
12902
|
+
def check(expr, lhs_var, rhs_var, *)
|
12903
12903
|
if expr.rhs_operand.constant?(@enum_tbl)
|
12904
|
-
promoted_type =
|
12904
|
+
promoted_type = lhs_var.type.integer_promoted_type
|
12905
12905
|
promoted_bit_size = C::ScalarValue.of(promoted_type.bit_size)
|
12906
|
-
if
|
12907
|
-
|
12908
|
-
W(:W0650, expr.location)
|
12906
|
+
if rhs_var.value.must_be_equal_to?(promoted_bit_size) ||
|
12907
|
+
rhs_var.value.must_be_greater_than?(promoted_bit_size)
|
12908
|
+
W(:W0650, expr.location, promoted_type.brief_image)
|
12909
12909
|
end
|
12910
12910
|
end
|
12911
12911
|
end
|
@@ -14486,17 +14486,17 @@ module CBuiltin #:nodoc:
|
|
14486
14486
|
end
|
14487
14487
|
|
14488
14488
|
private
|
14489
|
-
def check(expr,
|
14489
|
+
def check(expr, lhs_var, rhs_var, *)
|
14490
14490
|
if expr.rhs_operand.constant?(@enum_tbl)
|
14491
|
-
underlying_type =
|
14491
|
+
underlying_type = lhs_var.type
|
14492
14492
|
underlying_bit_size = C::ScalarValue.of(underlying_type.bit_size)
|
14493
|
-
promoted_type =
|
14493
|
+
promoted_type = lhs_var.type.integer_promoted_type
|
14494
14494
|
promoted_bit_size = C::ScalarValue.of(promoted_type.bit_size)
|
14495
14495
|
|
14496
|
-
if
|
14497
|
-
|
14498
|
-
|
14499
|
-
W(:W0719, expr.location)
|
14496
|
+
if rhs_var.value.must_be_equal_to?(underlying_bit_size) ||
|
14497
|
+
rhs_var.value.must_be_greater_than?(underlying_bit_size) and
|
14498
|
+
rhs_var.value.must_be_less_than?(promoted_bit_size)
|
14499
|
+
W(:W0719, expr.location, underlying_type.brief_image)
|
14500
14500
|
end
|
14501
14501
|
end
|
14502
14502
|
end
|
@@ -17509,29 +17509,28 @@ module CBuiltin #:nodoc:
|
|
17509
17509
|
end
|
17510
17510
|
|
17511
17511
|
private
|
17512
|
-
def check(
|
17513
|
-
return unless
|
17514
|
-
return unless
|
17515
|
-
|
17516
|
-
return unless lhs_variable.value.scalar? && rhs_variable.value.scalar?
|
17512
|
+
def check(binary_expr, lhs_var, rhs_var, result_var)
|
17513
|
+
return unless lhs_var.type.scalar? && lhs_var.type.unsigned?
|
17514
|
+
return unless rhs_var.type.scalar? && rhs_var.type.unsigned?
|
17515
|
+
return unless lhs_var.value.scalar? && rhs_var.value.scalar?
|
17517
17516
|
|
17518
|
-
case
|
17517
|
+
case binary_expr.operator.type
|
17519
17518
|
when "+"
|
17520
|
-
|
17519
|
+
unbound_val = lhs_var.value + rhs_var.value
|
17521
17520
|
when "-"
|
17522
|
-
|
17521
|
+
unbound_val = lhs_var.value - rhs_var.value
|
17523
17522
|
when "*"
|
17524
|
-
|
17523
|
+
unbound_val = lhs_var.value * rhs_var.value
|
17525
17524
|
else
|
17526
17525
|
return
|
17527
17526
|
end
|
17528
17527
|
|
17529
|
-
result_type =
|
17530
|
-
lower_test =
|
17531
|
-
upper_test =
|
17528
|
+
result_type = result_var.type
|
17529
|
+
lower_test = unbound_val < C::ScalarValue.of(result_type.min_value)
|
17530
|
+
upper_test = unbound_val > C::ScalarValue.of(result_type.max_value)
|
17532
17531
|
|
17533
17532
|
if lower_test.must_be_true? || upper_test.must_be_true?
|
17534
|
-
W(:W1051,
|
17533
|
+
W(:W1051, binary_expr.location, result_type.brief_image)
|
17535
17534
|
end
|
17536
17535
|
end
|
17537
17536
|
end
|
@@ -17547,30 +17546,29 @@ module CBuiltin #:nodoc:
|
|
17547
17546
|
end
|
17548
17547
|
|
17549
17548
|
private
|
17550
|
-
def check(
|
17551
|
-
return unless
|
17552
|
-
return unless
|
17549
|
+
def check(binary_expr, lhs_var, rhs_var, result_var)
|
17550
|
+
return unless lhs_var.type.scalar? && lhs_var.type.unsigned?
|
17551
|
+
return unless rhs_var.type.scalar? && rhs_var.type.unsigned?
|
17552
|
+
return unless lhs_var.value.scalar? && rhs_var.value.scalar?
|
17553
17553
|
|
17554
|
-
|
17555
|
-
|
17556
|
-
case binary_expression.operator.type
|
17554
|
+
case binary_expr.operator.type
|
17557
17555
|
when "+"
|
17558
|
-
|
17556
|
+
unbound_val = lhs_var.value + rhs_var.value
|
17559
17557
|
when "-"
|
17560
|
-
|
17558
|
+
unbound_val = lhs_var.value - rhs_var.value
|
17561
17559
|
when "*"
|
17562
|
-
|
17560
|
+
unbound_val = lhs_var.value * rhs_var.value
|
17563
17561
|
else
|
17564
17562
|
return
|
17565
17563
|
end
|
17566
17564
|
|
17567
|
-
result_type =
|
17568
|
-
lower_test =
|
17569
|
-
upper_test =
|
17565
|
+
result_type = result_var.type
|
17566
|
+
lower_test = unbound_val < C::ScalarValue.of(result_type.min_value)
|
17567
|
+
upper_test = unbound_val > C::ScalarValue.of(result_type.max_value)
|
17570
17568
|
|
17571
17569
|
if !lower_test.must_be_true? && lower_test.may_be_true? or
|
17572
17570
|
!upper_test.must_be_true? && upper_test.may_be_true?
|
17573
|
-
W(:W1052,
|
17571
|
+
W(:W1052, binary_expr.location, result_type.brief_image)
|
17574
17572
|
end
|
17575
17573
|
end
|
17576
17574
|
end
|
@@ -17965,8 +17963,8 @@ module CBuiltin #:nodoc:
|
|
17965
17963
|
if @current_function
|
17966
17964
|
@return_values.each_value do |retval|
|
17967
17965
|
unless retval[0]
|
17968
|
-
|
17969
|
-
W(:W1073, retval[1].location,
|
17966
|
+
func_name = retval[2].named? ? retval[2].name : "(anonymous)"
|
17967
|
+
W(:W1073, retval[1].location, func_name)
|
17970
17968
|
end
|
17971
17969
|
end
|
17972
17970
|
end
|
@@ -220,7 +220,7 @@ module CBuiltin #:nodoc:
|
|
220
220
|
mapping = @context[:ld_function_mapping]
|
221
221
|
functions = mapping.lookup_functions(function.name)
|
222
222
|
if functions.size > 1
|
223
|
-
functions.each { |
|
223
|
+
functions.each { |func| W(:W0791, func.location, func.signature) }
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
@@ -257,9 +257,9 @@ module CBuiltin #:nodoc:
|
|
257
257
|
mapping = @context[:ld_function_mapping]
|
258
258
|
defs_and_decls =
|
259
259
|
(mapping.lookup_function_declarations(function.name) +
|
260
|
-
mapping.lookup_functions(function.name)).select { |
|
261
|
-
if defs_and_decls.any? { |
|
262
|
-
defs_and_decls.each { |
|
260
|
+
mapping.lookup_functions(function.name)).select { |f| f.extern? }
|
261
|
+
if defs_and_decls.any? { |f| f.signature != function.signature }
|
262
|
+
defs_and_decls.each { |f| W(:W1037, f.location, f.name) }
|
263
263
|
end
|
264
264
|
end
|
265
265
|
|
data/lib/adlint/traits.rb
CHANGED
@@ -111,14 +111,12 @@ module AdLint #:nodoc:
|
|
111
111
|
|
112
112
|
class ProjectTraits
|
113
113
|
include Validation
|
114
|
+
include CompoundPathParser
|
114
115
|
|
115
116
|
def initialize(doc)
|
116
117
|
@project_name = doc["project_name"]
|
117
118
|
@project_root = Pathname.new(doc["project_root"])
|
118
|
-
@include_path =
|
119
|
-
(doc["include_path"] || []).compact.map { |compound_path_str|
|
120
|
-
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
121
|
-
}.flatten
|
119
|
+
@include_path = parse_compound_path_list(doc["include_path"])
|
122
120
|
@initial_header = doc["initial_header"]
|
123
121
|
@coding_style = CodingStyle.new(doc["coding_style"])
|
124
122
|
@file_encoding = doc["file_encoding"]
|
@@ -195,13 +193,11 @@ module AdLint #:nodoc:
|
|
195
193
|
# Traits information of the compiler used in the project.
|
196
194
|
class CompilerTraits
|
197
195
|
include Validation
|
196
|
+
include CompoundPathParser
|
198
197
|
|
199
198
|
def initialize(doc)
|
200
199
|
@standard_type = StandardType.new(doc["standard_type"])
|
201
|
-
@include_path =
|
202
|
-
(doc["include_path"] || []).compact.map { |compound_path_str|
|
203
|
-
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
204
|
-
}.flatten
|
200
|
+
@include_path = parse_compound_path_list(doc["include_path"])
|
205
201
|
@initial_header = doc["initial_header"]
|
206
202
|
@arithmetic = Arithmetic.new(doc["arithmetic"])
|
207
203
|
@extension_substitution = doc["extension_substitution"] || {}
|
@@ -485,18 +481,13 @@ module AdLint #:nodoc:
|
|
485
481
|
|
486
482
|
class MessageTraits
|
487
483
|
include Validation
|
484
|
+
include CompoundPathParser
|
488
485
|
|
489
486
|
def initialize(doc)
|
490
487
|
@language = doc["language"]
|
491
488
|
@message_with_class = doc["message_with_class"]
|
492
|
-
@warn_files_in =
|
493
|
-
|
494
|
-
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
495
|
-
}.flatten
|
496
|
-
@warn_files_not_in =
|
497
|
-
(doc["warn_files_not_in"] || []).compact.map { |compound_path_str|
|
498
|
-
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
499
|
-
}.flatten
|
489
|
+
@warn_files_in = parse_compound_path_list(doc["warn_files_in"])
|
490
|
+
@warn_files_not_in = parse_compound_path_list(doc["warn_files_not_in"])
|
500
491
|
@individual_selection = doc["individual_selection"]
|
501
492
|
@exclusion = Exclusion.new(doc["exclusion"])
|
502
493
|
@inclusion = Inclusion.new(doc["inclusion"])
|
data/lib/adlint/util.rb
CHANGED
@@ -582,6 +582,18 @@ module AdLint #:nodoc:
|
|
582
582
|
module_function :package_name_of
|
583
583
|
end
|
584
584
|
|
585
|
+
module CompoundPathParser
|
586
|
+
def parse_compound_path_list(ary)
|
587
|
+
(ary || []).compact.map { |str| parse_compound_path_str(str) }.flatten
|
588
|
+
end
|
589
|
+
module_function :parse_compound_path_list
|
590
|
+
|
591
|
+
def parse_compound_path_str(str)
|
592
|
+
str.split(File::PATH_SEPARATOR).map { |s| Pathname.new(s) }
|
593
|
+
end
|
594
|
+
module_function :parse_compound_path_str
|
595
|
+
end
|
596
|
+
|
585
597
|
end
|
586
598
|
|
587
599
|
if $0 == __FILE__
|