adlint 1.10.0 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +197 -4
- data/MANIFEST +17 -0
- data/NEWS +23 -4
- data/etc/mesg.d/en_US/messages.yml +14 -1
- data/etc/mesg.d/ja_JP/messages.yml +14 -1
- data/features/message_detection/W0093.feature +87 -0
- data/features/message_detection/W0687.feature +25 -0
- data/features/message_detection/W0688.feature +63 -0
- data/features/message_detection/W0689.feature +46 -0
- data/features/message_detection/W0690.feature +35 -0
- data/features/message_detection/W0698.feature +3 -2
- data/features/message_detection/W0703.feature +1 -0
- data/features/message_detection/W0723.feature +34 -0
- data/features/message_detection/W0732.feature +158 -0
- data/features/message_detection/W0733.feature +158 -0
- data/features/message_detection/W0734.feature +322 -0
- data/features/message_detection/W0735.feature +322 -0
- data/features/message_detection/W1052.feature +66 -0
- data/features/message_detection/W9001.feature +33 -0
- data/features/message_detection/W9003.feature +131 -0
- data/lib/adlint/c/ctrlexpr.rb +51 -50
- data/lib/adlint/c/domain.rb +237 -223
- data/lib/adlint/c/expr.rb +6 -8
- data/lib/adlint/c/interp.rb +8 -11
- data/lib/adlint/c/message.rb +20 -0
- data/lib/adlint/c/message_shima.rb +63 -0
- data/lib/adlint/c/object.rb +5 -4
- data/lib/adlint/c/operator.rb +99 -0
- data/lib/adlint/c/parser.rb +2 -2
- data/lib/adlint/c/parser.y +2 -2
- data/lib/adlint/c/phase.rb +6 -1
- data/lib/adlint/c/syntax.rb +442 -30
- data/lib/adlint/c/type.rb +449 -363
- data/lib/adlint/c/value.rb +96 -25
- data/lib/adlint/c.rb +1 -0
- data/lib/adlint/prelude.rb +16 -18
- data/lib/adlint/version.rb +2 -2
- data/share/doc/developers_guide_ja.html +11 -5
- data/share/doc/developers_guide_ja.texi +9 -3
- data/share/doc/users_guide_en.html +697 -131
- data/share/doc/users_guide_en.texi +491 -41
- data/share/doc/users_guide_ja.html +709 -139
- data/share/doc/users_guide_ja.texi +499 -45
- data/spec/adlint/c/ctrlexpr_spec.rb +168 -0
- data/spec/adlint/c/domain_spec.rb +835 -0
- data/spec/adlint/c/operator_spec.rb +406 -0
- data/spec/adlint/c/syntax_spec.rb +717 -0
- data/spec/adlint/c/type_spec.rb +55 -30
- metadata +19 -2
data/lib/adlint/c/domain.rb
CHANGED
@@ -31,6 +31,7 @@
|
|
31
31
|
|
32
32
|
require "adlint/traits"
|
33
33
|
require "adlint/util"
|
34
|
+
require "adlint/c/operator"
|
34
35
|
|
35
36
|
module AdLint #:nodoc:
|
36
37
|
module C #:nodoc:
|
@@ -192,7 +193,7 @@ module C #:nodoc:
|
|
192
193
|
def _create_union(lhs_value_domain, rhs_value_domain)
|
193
194
|
expected = lhs_value_domain.complexity + rhs_value_domain.complexity
|
194
195
|
if expected < COMPOSITE_MAX_COMPLEXITY
|
195
|
-
|
196
|
+
UnionValueDomain.new(lhs_value_domain, rhs_value_domain)
|
196
197
|
else
|
197
198
|
of_ambiguous(
|
198
199
|
lhs_value_domain.undefined? || rhs_value_domain.undefined?)
|
@@ -326,22 +327,22 @@ module C #:nodoc:
|
|
326
327
|
subclass_responsibility
|
327
328
|
end
|
328
329
|
|
329
|
-
def narrow(
|
330
|
-
case
|
331
|
-
when
|
330
|
+
def narrow(operator, operand_value_domain)
|
331
|
+
case operator
|
332
|
+
when Operator::EQ
|
332
333
|
_narrow_by_eq(operand_value_domain)
|
333
|
-
when
|
334
|
+
when Operator::NE
|
334
335
|
_narrow_by_ne(operand_value_domain)
|
335
|
-
when
|
336
|
+
when Operator::LT
|
336
337
|
_narrow_by_lt(operand_value_domain)
|
337
|
-
when
|
338
|
+
when Operator::GT
|
338
339
|
_narrow_by_gt(operand_value_domain)
|
339
|
-
when
|
340
|
+
when Operator::LE
|
340
341
|
_narrow_by_le(operand_value_domain)
|
341
|
-
when
|
342
|
+
when Operator::GE
|
342
343
|
_narrow_by_ge(operand_value_domain)
|
343
344
|
else
|
344
|
-
|
345
|
+
__NOTREACHED__
|
345
346
|
end
|
346
347
|
end
|
347
348
|
|
@@ -449,22 +450,22 @@ module C #:nodoc:
|
|
449
450
|
_narrow_by_gt(rhs_domain).union(_narrow_by_eq(rhs_domain))
|
450
451
|
end
|
451
452
|
|
452
|
-
def widen(
|
453
|
-
case
|
454
|
-
when
|
453
|
+
def widen(operator, operand_value_domain)
|
454
|
+
case operator
|
455
|
+
when Operator::EQ
|
455
456
|
_widen_by_eq(operand_value_domain)
|
456
|
-
when
|
457
|
+
when Operator::NE
|
457
458
|
_widen_by_ne(operand_value_domain)
|
458
|
-
when
|
459
|
+
when Operator::LT
|
459
460
|
_widen_by_lt(operand_value_domain)
|
460
|
-
when
|
461
|
+
when Operator::GT
|
461
462
|
_widen_by_gt(operand_value_domain)
|
462
|
-
when
|
463
|
+
when Operator::LE
|
463
464
|
_widen_by_le(operand_value_domain)
|
464
|
-
when
|
465
|
+
when Operator::GE
|
465
466
|
_widen_by_ge(operand_value_domain)
|
466
467
|
else
|
467
|
-
|
468
|
+
__NOTREACHED__
|
468
469
|
end
|
469
470
|
end
|
470
471
|
|
@@ -477,11 +478,13 @@ module C #:nodoc:
|
|
477
478
|
end
|
478
479
|
|
479
480
|
def _widen_by_lt(rhs_domain, lhs_domain = self)
|
480
|
-
lhs_domain.union(ValueDomain.of_unlimited.narrow(
|
481
|
+
lhs_domain.union(ValueDomain.of_unlimited.narrow(Operator::LT,
|
482
|
+
rhs_domain))
|
481
483
|
end
|
482
484
|
|
483
485
|
def _widen_by_gt(rhs_domain, lhs_domain = self)
|
484
|
-
lhs_domain.union(ValueDomain.of_unlimited.narrow(
|
486
|
+
lhs_domain.union(ValueDomain.of_unlimited.narrow(Operator::GT,
|
487
|
+
rhs_domain))
|
485
488
|
end
|
486
489
|
|
487
490
|
def _widen_by_le(rhs_domain, lhs_domain = self)
|
@@ -3074,35 +3077,37 @@ module C #:nodoc:
|
|
3074
3077
|
end
|
3075
3078
|
|
3076
3079
|
def _mul_less_than(lhs_domain, rhs_domain = self)
|
3077
|
-
if rhs_domain.value == 0
|
3078
|
-
|
3080
|
+
return ValueDomain.equal_to(0) if rhs_domain.value == 0
|
3081
|
+
|
3082
|
+
if lhs_domain.value <= 0
|
3083
|
+
if rhs_domain.value < 0
|
3084
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3085
|
+
else
|
3086
|
+
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3087
|
+
end
|
3079
3088
|
else
|
3080
|
-
|
3081
|
-
when lhs_domain.value <= 0 && rhs_domain.value < 0
|
3089
|
+
if rhs_domain.value < 0
|
3082
3090
|
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3083
|
-
|
3084
|
-
ValueDomain.of_unlimited
|
3085
|
-
when lhs_domain.value <= 0 && rhs_domain.value > 0
|
3091
|
+
else
|
3086
3092
|
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3087
|
-
when lhs_domain.value > 0 && rhs_domain.value > 0
|
3088
|
-
ValueDomain.of_unlimited
|
3089
3093
|
end
|
3090
3094
|
end
|
3091
3095
|
end
|
3092
3096
|
|
3093
3097
|
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
3094
|
-
if rhs_domain.value == 0
|
3095
|
-
|
3098
|
+
return ValueDomain.equal_to(0) if rhs_domain.value == 0
|
3099
|
+
|
3100
|
+
if lhs_domain.value >= 0
|
3101
|
+
if rhs_domain.value < 0
|
3102
|
+
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3103
|
+
else
|
3104
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3105
|
+
end
|
3096
3106
|
else
|
3097
|
-
|
3098
|
-
when lhs_domain.value >= 0 && rhs_domain.value < 0
|
3107
|
+
if rhs_domain.value < 0
|
3099
3108
|
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3100
|
-
|
3101
|
-
ValueDomain.of_unlimited
|
3102
|
-
when lhs_domain.value >= 0 && rhs_domain.value > 0
|
3109
|
+
else
|
3103
3110
|
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3104
|
-
when lhs_domain.value < 0 && rhs_domain.value > 0
|
3105
|
-
ValueDomain.of_unlimited
|
3106
3111
|
end
|
3107
3112
|
end
|
3108
3113
|
end
|
@@ -3941,27 +3946,33 @@ module C #:nodoc:
|
|
3941
3946
|
end
|
3942
3947
|
|
3943
3948
|
def _mul_less_than(lhs_domain, rhs_domain = self)
|
3944
|
-
if
|
3945
|
-
|
3949
|
+
if lhs_domain.value <= 0
|
3950
|
+
if rhs_domain.value <= 0
|
3951
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3952
|
+
else
|
3953
|
+
ValueDomain.of_unlimited
|
3954
|
+
end
|
3946
3955
|
else
|
3947
|
-
|
3948
|
-
|
3949
|
-
|
3950
|
-
|
3951
|
-
ValueDomain.less_than(0)
|
3956
|
+
if rhs_domain.value <= 0
|
3957
|
+
ValueDomain.of_unlimited
|
3958
|
+
else
|
3959
|
+
ValueDomain.of_unlimited
|
3952
3960
|
end
|
3953
3961
|
end
|
3954
3962
|
end
|
3955
3963
|
|
3956
3964
|
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
3957
|
-
if
|
3958
|
-
|
3965
|
+
if lhs_domain.value >= 0
|
3966
|
+
if rhs_domain.value <= 0
|
3967
|
+
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3968
|
+
else
|
3969
|
+
ValueDomain.of_unlimited
|
3970
|
+
end
|
3959
3971
|
else
|
3960
|
-
|
3961
|
-
|
3962
|
-
|
3963
|
-
|
3964
|
-
ValueDomain.greater_than(0)
|
3972
|
+
if rhs_domain.value <= 0
|
3973
|
+
ValueDomain.of_unlimited
|
3974
|
+
else
|
3975
|
+
ValueDomain.of_unlimited
|
3965
3976
|
end
|
3966
3977
|
end
|
3967
3978
|
end
|
@@ -4845,14 +4856,17 @@ module C #:nodoc:
|
|
4845
4856
|
end
|
4846
4857
|
|
4847
4858
|
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
4848
|
-
if
|
4849
|
-
|
4859
|
+
if lhs_domain.value >= 0
|
4860
|
+
if rhs_domain.value >= 0
|
4861
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
4862
|
+
else
|
4863
|
+
ValueDomain.of_unlimited
|
4864
|
+
end
|
4850
4865
|
else
|
4851
|
-
|
4852
|
-
|
4853
|
-
|
4854
|
-
|
4855
|
-
ValueDomain.less_than(0)
|
4866
|
+
if rhs_domain.value >= 0
|
4867
|
+
ValueDomain.of_unlimited
|
4868
|
+
else
|
4869
|
+
ValueDomain.of_unlimited
|
4856
4870
|
end
|
4857
4871
|
end
|
4858
4872
|
end
|
@@ -5471,7 +5485,8 @@ module C #:nodoc:
|
|
5471
5485
|
end
|
5472
5486
|
|
5473
5487
|
def _narrow_by_lt(rhs_domain, lhs_domain = self)
|
5474
|
-
lhs_domain.intersection(ValueDomain.of_unlimited.narrow(
|
5488
|
+
lhs_domain.intersection(ValueDomain.of_unlimited.narrow(Operator::LT,
|
5489
|
+
rhs_domain))
|
5475
5490
|
end
|
5476
5491
|
|
5477
5492
|
def _narrow_nil_by_lt(lhs_domain, rhs_domain = self)
|
@@ -5517,7 +5532,8 @@ module C #:nodoc:
|
|
5517
5532
|
end
|
5518
5533
|
|
5519
5534
|
def _narrow_by_gt(rhs_domain, lhs_domain = self)
|
5520
|
-
lhs_domain.intersection(ValueDomain.of_unlimited.narrow(
|
5535
|
+
lhs_domain.intersection(ValueDomain.of_unlimited.narrow(Operator::GT,
|
5536
|
+
rhs_domain))
|
5521
5537
|
end
|
5522
5538
|
|
5523
5539
|
def _narrow_nil_by_gt(lhs_domain, rhs_domain = self)
|
@@ -5592,36 +5608,6 @@ module C #:nodoc:
|
|
5592
5608
|
rhs_domain + lhs_domain
|
5593
5609
|
end
|
5594
5610
|
|
5595
|
-
def _mul_nil(lhs_domain, rhs_domain = self)
|
5596
|
-
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5597
|
-
# This method invokes CompositeValueDomain#*.
|
5598
|
-
rhs_domain * lhs_domain
|
5599
|
-
end
|
5600
|
-
|
5601
|
-
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
5602
|
-
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5603
|
-
# This method invokes CompositeValueDomain#*.
|
5604
|
-
rhs_domain * lhs_domain
|
5605
|
-
end
|
5606
|
-
|
5607
|
-
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
5608
|
-
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5609
|
-
# This method invokes CompositeValueDomain#*.
|
5610
|
-
rhs_domain * lhs_domain
|
5611
|
-
end
|
5612
|
-
|
5613
|
-
def _mul_less_than(lhs_domain, rhs_domain = self)
|
5614
|
-
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5615
|
-
# This method invokes CompositeValueDomain#*.
|
5616
|
-
rhs_domain * lhs_domain
|
5617
|
-
end
|
5618
|
-
|
5619
|
-
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
5620
|
-
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5621
|
-
# This method invokes CompositeValueDomain#*.
|
5622
|
-
rhs_domain * lhs_domain
|
5623
|
-
end
|
5624
|
-
|
5625
5611
|
def _div_nil(lhs_domain, rhs_domain = self)
|
5626
5612
|
_div(lhs_domain, rhs_domain)
|
5627
5613
|
end
|
@@ -6093,7 +6079,82 @@ module C #:nodoc:
|
|
6093
6079
|
end
|
6094
6080
|
|
6095
6081
|
def *(rhs_domain)
|
6096
|
-
|
6082
|
+
# NOTE: Multiplication of LessThanValueDomain or GreaterThanValueDomain
|
6083
|
+
# always makes UnlimitedValueDomain when the domain contains both
|
6084
|
+
# positive and negative values.
|
6085
|
+
# So, multiplication of IntersectionValueDomain cannot be defined
|
6086
|
+
# in the same manner as other arithmetics.
|
6087
|
+
if rhs_domain.kind_of?(IntersectionValueDomain)
|
6088
|
+
lhs_domain = self
|
6089
|
+
|
6090
|
+
lval = [
|
6091
|
+
(n = lhs_domain.min_value).integer? ? n - 1 : n - Float::EPSILON,
|
6092
|
+
(n = lhs_domain.max_value).integer? ? n + 1 : n + Float::EPSILON
|
6093
|
+
]
|
6094
|
+
labs = lval.map { |val| val.abs }.sort
|
6095
|
+
|
6096
|
+
rval = [
|
6097
|
+
(n = rhs_domain.min_value).integer? ? n - 1 : n - Float::EPSILON,
|
6098
|
+
(n = rhs_domain.max_value).integer? ? n + 1 : n + Float::EPSILON
|
6099
|
+
]
|
6100
|
+
rabs = rval.map { |val| val.abs }.sort
|
6101
|
+
|
6102
|
+
comp = lambda { |op, nums| nums.all? { |num| num.__send__(op, 0) } }
|
6103
|
+
only_negative, only_positive = comp.curry[:<], comp.curry[:>=]
|
6104
|
+
|
6105
|
+
case lval
|
6106
|
+
when only_positive
|
6107
|
+
case rval
|
6108
|
+
when only_positive
|
6109
|
+
_mul_only_positive_and_only_positive(lval, labs, rval, rabs)
|
6110
|
+
when only_negative
|
6111
|
+
_mul_only_positive_and_only_negative(lval, labs, rval, rabs)
|
6112
|
+
else
|
6113
|
+
_mul_only_positive_and_positive_negative(lval, labs, rval, rabs)
|
6114
|
+
end
|
6115
|
+
when only_negative
|
6116
|
+
case rval
|
6117
|
+
when only_positive
|
6118
|
+
_mul_only_positive_and_only_negative(rval, rabs, lval, labs)
|
6119
|
+
when only_negative
|
6120
|
+
_mul_only_negative_and_only_negative(lval, labs, rval, rabs)
|
6121
|
+
else
|
6122
|
+
_mul_only_negative_and_positive_negative(lval, labs, rval, rabs)
|
6123
|
+
end
|
6124
|
+
else
|
6125
|
+
_mul_positive_negative_and_positive_negative(lval, labs, rval, rabs)
|
6126
|
+
end
|
6127
|
+
else
|
6128
|
+
rhs_domain * self
|
6129
|
+
end
|
6130
|
+
end
|
6131
|
+
|
6132
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
6133
|
+
# NOTE: NilValueDomain contains no values.
|
6134
|
+
# So, any arithmetic operation with NilValueDomain makes
|
6135
|
+
# NilValueDomain.
|
6136
|
+
lhs_domain
|
6137
|
+
end
|
6138
|
+
|
6139
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
6140
|
+
# NOTE: UnlimitedValueDomain contains everything.
|
6141
|
+
# So, this arithmetic operation with UnlimitedValueDomain makes
|
6142
|
+
# UnlimitedValueDomain.
|
6143
|
+
lhs_domain
|
6144
|
+
end
|
6145
|
+
|
6146
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
6147
|
+
new_sub_domains = rhs_domain.domain_pair.map { |rhs| lhs_domain * rhs }
|
6148
|
+
new_sub_domains.first.intersection(new_sub_domains.last)
|
6149
|
+
end
|
6150
|
+
|
6151
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
6152
|
+
new_sub_domains = rhs_domain.domain_pair.map { |rhs| lhs_domain * rhs }
|
6153
|
+
new_sub_domains.first.intersection(new_sub_domains.last)
|
6154
|
+
end
|
6155
|
+
|
6156
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
6157
|
+
new_sub_domains = rhs_domain.domain_pair.map { |rhs| lhs_domain * rhs }
|
6097
6158
|
new_sub_domains.first.intersection(new_sub_domains.last)
|
6098
6159
|
end
|
6099
6160
|
|
@@ -6235,6 +6296,57 @@ module C #:nodoc:
|
|
6235
6296
|
memoize :to_s
|
6236
6297
|
|
6237
6298
|
private
|
6299
|
+
def _mul_only_positive_and_only_positive(lval, labs, rval, rabs)
|
6300
|
+
# NOTE: (++) * (++) makes a new IntersectionValueDomain;
|
6301
|
+
# lower bound: (labs.min * rabs.min)
|
6302
|
+
# upper bound: (labs.max * rabs.max)
|
6303
|
+
ValueDomain.greater_than(labs.first * rabs.first).intersection(
|
6304
|
+
ValueDomain.less_than(labs.last * rabs.last))
|
6305
|
+
end
|
6306
|
+
|
6307
|
+
def _mul_only_positive_and_only_negative(lval, labs, rval, rabs)
|
6308
|
+
# NOTE: (++) * (--) makes a new IntersectionValueDomain;
|
6309
|
+
# lower bound: -(labs.max * rabs.max)
|
6310
|
+
# upper bound: -(labs.min * rabs.min)
|
6311
|
+
ValueDomain.greater_than(-(labs.last * rabs.last)).intersection(
|
6312
|
+
ValueDomain.less_than(-(labs.first * rabs.first)))
|
6313
|
+
end
|
6314
|
+
|
6315
|
+
def _mul_only_positive_and_positive_negative(lval, labs, rval, rabs)
|
6316
|
+
# NOTE: (++) * (-+) makes a new IntersectionValueDomain;
|
6317
|
+
# lower bound: (labs.max * rval.min)
|
6318
|
+
# upper bound: (labs.max * rval.max)
|
6319
|
+
ValueDomain.greater_than(labs.last * rval.first).intersection(
|
6320
|
+
ValueDomain.less_than(labs.last * rval.last))
|
6321
|
+
end
|
6322
|
+
|
6323
|
+
def _mul_only_negative_and_only_negative(lval, labs, rval, rabs)
|
6324
|
+
# NOTE: (--) * (--) makes a new IntersectionValueDomain;
|
6325
|
+
# upper bound: (labs.min * rabs.min)
|
6326
|
+
# lower bound: (labs.max * rabs.max)
|
6327
|
+
ValueDomain.greater_than(labs.first * rabs.first).intersection(
|
6328
|
+
ValueDomain.less_than(labs.last * rabs.last))
|
6329
|
+
end
|
6330
|
+
|
6331
|
+
def _mul_only_negative_and_positive_negative(lval, labs, rval, rabs)
|
6332
|
+
# NOTE: (--) * (-+) makes a new IntersectionValueDomain;
|
6333
|
+
# lower bound: -(labs.max * rval.max)
|
6334
|
+
# upper_bound: -(labs.max * rval.min)
|
6335
|
+
ValueDomain.greater_than(-(labs.last * rval.last)).intersection(
|
6336
|
+
ValueDomain.less_than(-(labs.last * rval.first)))
|
6337
|
+
end
|
6338
|
+
|
6339
|
+
def _mul_positive_negative_and_positive_negative(lval, labs, rval, rabs)
|
6340
|
+
# NOTE: (-+) * (-+) makes a new IntersectionValueDomain;
|
6341
|
+
# lower bound: ([lval.min * rval.max, lval.max * rval.min].min)
|
6342
|
+
# upper bound: ([lval.min * rval.min, lval.max * rval.max].max)
|
6343
|
+
ValueDomain.greater_than(
|
6344
|
+
[lval.first * rval.last, lval.last * rval.first].min
|
6345
|
+
).intersection(ValueDomain.less_than(
|
6346
|
+
[lval.first * rval.first, lval.last, rval.last].max
|
6347
|
+
))
|
6348
|
+
end
|
6349
|
+
|
6238
6350
|
def _div(lhs_domain, rhs_domain = self)
|
6239
6351
|
new_sub_domains = rhs_domain.domain_pair.map { |rhs| lhs_domain / rhs }
|
6240
6352
|
new_sub_domains.first.intersection(new_sub_domains.last)
|
@@ -6380,6 +6492,36 @@ module C #:nodoc:
|
|
6380
6492
|
new_sub_domains.first.union(new_sub_domains.last)
|
6381
6493
|
end
|
6382
6494
|
|
6495
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
6496
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6497
|
+
# This method invokes CompositeValueDomain#*.
|
6498
|
+
rhs_domain * lhs_domain
|
6499
|
+
end
|
6500
|
+
|
6501
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
6502
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6503
|
+
# This method invokes CompositeValueDomain#*.
|
6504
|
+
rhs_domain * lhs_domain
|
6505
|
+
end
|
6506
|
+
|
6507
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
6508
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6509
|
+
# This method invokes CompositeValueDomain#*.
|
6510
|
+
rhs_domain * lhs_domain
|
6511
|
+
end
|
6512
|
+
|
6513
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
6514
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6515
|
+
# This method invokes CompositeValueDomain#*.
|
6516
|
+
rhs_domain * lhs_domain
|
6517
|
+
end
|
6518
|
+
|
6519
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
6520
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6521
|
+
# This method invokes CompositeValueDomain#*.
|
6522
|
+
rhs_domain * lhs_domain
|
6523
|
+
end
|
6524
|
+
|
6383
6525
|
def /(rhs_domain)
|
6384
6526
|
new_sub_domains = domain_pair.map { |lhs| lhs / rhs_domain }
|
6385
6527
|
new_sub_domains.first.union(new_sub_domains.last)
|
@@ -7113,7 +7255,7 @@ module C #:nodoc:
|
|
7113
7255
|
rhs_domain.intersect?(lhs_domain)
|
7114
7256
|
end
|
7115
7257
|
|
7116
|
-
def narrow(
|
7258
|
+
def narrow(operator, operand_value_domain)
|
7117
7259
|
self
|
7118
7260
|
end
|
7119
7261
|
|
@@ -7213,7 +7355,7 @@ module C #:nodoc:
|
|
7213
7355
|
ValueDomain.of_ambiguous(@undefined)
|
7214
7356
|
end
|
7215
7357
|
|
7216
|
-
def widen(
|
7358
|
+
def widen(operator, operand_value_domain)
|
7217
7359
|
self
|
7218
7360
|
end
|
7219
7361
|
|
@@ -7769,131 +7911,3 @@ module C #:nodoc:
|
|
7769
7911
|
|
7770
7912
|
end
|
7771
7913
|
end
|
7772
|
-
|
7773
|
-
if $0 == __FILE__
|
7774
|
-
include AdLint::C
|
7775
|
-
|
7776
|
-
d1 = ValueDomain.equal_to(-2147483647)
|
7777
|
-
d2 = ValueDomain.equal_to(-2147483647)
|
7778
|
-
p d1.contain?(d2)
|
7779
|
-
|
7780
|
-
puts "---"
|
7781
|
-
d1 = ValueDomain.of_undefined(-10..10)
|
7782
|
-
d2 = ValueDomain.equal_to(-5).union(ValueDomain.equal_to(5))
|
7783
|
-
p d1, d2, d1.contain?(d2), !d2.contain?(d1)
|
7784
|
-
|
7785
|
-
puts "---"
|
7786
|
-
d2 = d2.intersection(ValueDomain.greater_than_or_equal_to(-10))
|
7787
|
-
d2 = d2.intersection(ValueDomain.less_than_or_equal_to(10))
|
7788
|
-
p d1, d2, d1.contain?(d2), !d2.contain?(d1)
|
7789
|
-
|
7790
|
-
puts "---"
|
7791
|
-
d1 = d1.intersection(ValueDomain.less_than(0))
|
7792
|
-
p d1, d2, !d1.contain?(d2), !d2.contain?(d1)
|
7793
|
-
|
7794
|
-
puts "---"
|
7795
|
-
d2 = d2.intersection(ValueDomain.less_than(0))
|
7796
|
-
p d1, d2, d1.contain?(d2), !d2.contain?(d1)
|
7797
|
-
|
7798
|
-
puts "---"
|
7799
|
-
d1 = ValueDomain.greater_than(-2147483647)
|
7800
|
-
d1 = d1.intersection(ValueDomain.less_than(0))
|
7801
|
-
d1 = d1.union(ValueDomain.equal_to(0))
|
7802
|
-
d2 = ValueDomain.equal_to(-2147483647)
|
7803
|
-
d2 = d2.union(ValueDomain.equal_to(0))
|
7804
|
-
p d1, d2
|
7805
|
-
d1 = d1.union(d2)
|
7806
|
-
p d1
|
7807
|
-
|
7808
|
-
puts "---"
|
7809
|
-
d1 = ValueDomain.equal_to(-2147483647).union(ValueDomain.equal_to(0))
|
7810
|
-
d2 = ValueDomain.equal_to(-2147483647).union(ValueDomain.equal_to(0))
|
7811
|
-
p d1, d2
|
7812
|
-
p d1.contain?(d2)
|
7813
|
-
p d1.contain?(ValueDomain.equal_to(-2147483647))
|
7814
|
-
p d1.contain?(ValueDomain.equal_to(0))
|
7815
|
-
|
7816
|
-
puts "---"
|
7817
|
-
d1 = ValueDomain.greater_than(-2147483648)
|
7818
|
-
d1 = d1.intersection(ValueDomain.less_than(2147483647))
|
7819
|
-
d1 = d1.union(ValueDomain.equal_to(2147483647))
|
7820
|
-
d2 = d1.dup
|
7821
|
-
p d1, d2
|
7822
|
-
p d1.contain?(d2)
|
7823
|
-
p d1.intersection(d2)
|
7824
|
-
|
7825
|
-
puts "---"
|
7826
|
-
d1 = ValueDomain.greater_than(1)
|
7827
|
-
d1 = d1.intersection(ValueDomain.less_than(2147483647))
|
7828
|
-
d1 = d1.union(ValueDomain.equal_to(1))
|
7829
|
-
d2 = ValueDomain.equal_to(2147483647)
|
7830
|
-
d2 = d2.union(ValueDomain.equal_to(1))
|
7831
|
-
p d1, d2
|
7832
|
-
p d1.union(d2)
|
7833
|
-
|
7834
|
-
puts "---"
|
7835
|
-
d1 = ValueDomain.greater_than(0).intersection(ValueDomain.less_than(429))
|
7836
|
-
d1 = d1.union(ValueDomain.equal_to(429))
|
7837
|
-
d2 = ValueDomain.equal_to(0)
|
7838
|
-
p d1.intersection(d2)
|
7839
|
-
|
7840
|
-
puts "---"
|
7841
|
-
d1 = UndefinedValueDomain.new(0..10)
|
7842
|
-
d2 = UndefinedValueDomain.new(0..10)
|
7843
|
-
p d1 + d2
|
7844
|
-
|
7845
|
-
puts "---"
|
7846
|
-
d1 = ValueDomain.greater_than_or_equal_to(-10).intersection(
|
7847
|
-
ValueDomain.less_than_or_equal_to(10))
|
7848
|
-
d2 = ValueDomain.equal_to(0)
|
7849
|
-
p d1, d2
|
7850
|
-
p d1.intersect?(d2)
|
7851
|
-
p d1 < d2
|
7852
|
-
|
7853
|
-
puts "---"
|
7854
|
-
d1 = ValueDomain.greater_than(1)
|
7855
|
-
d1 = d1.intersection(ValueDomain.less_than(11))
|
7856
|
-
d1 = d1.union(ValueDomain.equal_to(11))
|
7857
|
-
d2 = ValueDomain.greater_than(0)
|
7858
|
-
d2 = d2.intersection(ValueDomain.less_than(10))
|
7859
|
-
d2 = d2.union(ValueDomain.equal_to(0))
|
7860
|
-
d2 = d2.union(ValueDomain.equal_to(10))
|
7861
|
-
p d1, d2
|
7862
|
-
p d1.narrow(:==, d2)
|
7863
|
-
|
7864
|
-
puts "---"
|
7865
|
-
d1 = ValueDomain.greater_than(-129)
|
7866
|
-
d1 = d1.intersection(ValueDomain.less_than(128))
|
7867
|
-
d2 = ValueDomain.equal_to(-128)
|
7868
|
-
p d1, d2
|
7869
|
-
p d1.intersect?(d2)
|
7870
|
-
p d1 < d2
|
7871
|
-
|
7872
|
-
puts "---"
|
7873
|
-
d1 = ValueDomain.greater_than(-129)
|
7874
|
-
d1 = d1.intersection(ValueDomain.less_than(128))
|
7875
|
-
d2 = ValueDomain.equal_to(127)
|
7876
|
-
p d1, d2
|
7877
|
-
p d1.intersect?(d2)
|
7878
|
-
p d1 > d2
|
7879
|
-
|
7880
|
-
puts "---"
|
7881
|
-
d1 = ValueDomain.greater_than(-129)
|
7882
|
-
d2 = ValueDomain.equal_to(127)
|
7883
|
-
p d1, d2
|
7884
|
-
p d1 < d2
|
7885
|
-
|
7886
|
-
puts "---"
|
7887
|
-
d1 = ValueDomain.less_than(128)
|
7888
|
-
d2 = ValueDomain.equal_to(127)
|
7889
|
-
p d1, d2
|
7890
|
-
p d1 < d2
|
7891
|
-
|
7892
|
-
puts "---"
|
7893
|
-
d1 = ValueDomain.greater_than_or_equal_to(-2147483648)
|
7894
|
-
d1 = d1.intersection(ValueDomain.less_than_or_equal_to(2147483647))
|
7895
|
-
d1 = ValueDomain.of_undefined(d1)
|
7896
|
-
d2 = ValueDomain.equal_to(1)
|
7897
|
-
p d1, d2
|
7898
|
-
p d1.narrow(:!=, d2)
|
7899
|
-
end
|
data/lib/adlint/c/expr.rb
CHANGED
@@ -374,7 +374,7 @@ module C #:nodoc:
|
|
374
374
|
when "!"
|
375
375
|
result = temporary_variable(int_type, !variable.value)
|
376
376
|
else
|
377
|
-
|
377
|
+
__NOTREACHED__
|
378
378
|
end
|
379
379
|
_notify_variable_value_referred(node, variable)
|
380
380
|
|
@@ -445,7 +445,7 @@ module C #:nodoc:
|
|
445
445
|
result = temporary_variable(lhs_converted.type,
|
446
446
|
lhs_converted.value % rhs_converted.value)
|
447
447
|
else
|
448
|
-
|
448
|
+
__NOTREACHED__
|
449
449
|
end
|
450
450
|
_notify_variable_value_referred(node, lhs_variable)
|
451
451
|
_notify_variable_value_referred(node, rhs_variable)
|
@@ -497,7 +497,7 @@ module C #:nodoc:
|
|
497
497
|
result = temporary_variable(lhs_converted.type,
|
498
498
|
lhs_converted.value - rhs_converted.value)
|
499
499
|
else
|
500
|
-
|
500
|
+
__NOTREACHED__
|
501
501
|
end
|
502
502
|
_notify_variable_value_referred(node, lhs_variable)
|
503
503
|
_notify_variable_value_referred(node, rhs_variable)
|
@@ -557,7 +557,7 @@ module C #:nodoc:
|
|
557
557
|
result = temporary_variable(lhs_converted.type,
|
558
558
|
lhs_converted.value >> rhs_converted.value)
|
559
559
|
else
|
560
|
-
|
560
|
+
__NOTREACHED__
|
561
561
|
end
|
562
562
|
_notify_variable_value_referred(node, lhs_variable)
|
563
563
|
_notify_variable_value_referred(node, rhs_variable)
|
@@ -615,8 +615,7 @@ module C #:nodoc:
|
|
615
615
|
result = temporary_variable(int_type,
|
616
616
|
lhs_converted.value >= rhs_converted.value)
|
617
617
|
else
|
618
|
-
|
619
|
-
result = temporary_variable(int_type, ScalarValue.of_arbitrary)
|
618
|
+
__NOTREACHED__
|
620
619
|
end
|
621
620
|
_notify_variable_value_referred(node, lhs_variable)
|
622
621
|
_notify_variable_value_referred(node, rhs_variable)
|
@@ -668,8 +667,7 @@ module C #:nodoc:
|
|
668
667
|
result = temporary_variable(int_type,
|
669
668
|
lhs_converted.value != rhs_converted.value)
|
670
669
|
else
|
671
|
-
|
672
|
-
result = temporary_variable(int_type, ScalarValue.of_arbitrary)
|
670
|
+
__NOTREACHED__
|
673
671
|
end
|
674
672
|
_notify_variable_value_referred(node, lhs_variable)
|
675
673
|
_notify_variable_value_referred(node, rhs_variable)
|