adlint 1.10.0 → 1.12.0
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 +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/value.rb
CHANGED
@@ -30,6 +30,7 @@
|
|
30
30
|
#++
|
31
31
|
|
32
32
|
require "adlint/c/domain"
|
33
|
+
require "adlint/c/operator"
|
33
34
|
|
34
35
|
module AdLint #:nodoc:
|
35
36
|
module C #:nodoc:
|
@@ -79,6 +80,14 @@ module C #:nodoc:
|
|
79
80
|
subclass_responsibility
|
80
81
|
end
|
81
82
|
|
83
|
+
def definite?
|
84
|
+
subclass_responsibility
|
85
|
+
end
|
86
|
+
|
87
|
+
def contain?(value)
|
88
|
+
subclass_responsibility
|
89
|
+
end
|
90
|
+
|
82
91
|
def multiple?
|
83
92
|
subclass_responsibility
|
84
93
|
end
|
@@ -87,11 +96,11 @@ module C #:nodoc:
|
|
87
96
|
subclass_responsibility
|
88
97
|
end
|
89
98
|
|
90
|
-
def narrow_domain!(
|
99
|
+
def narrow_domain!(operator, operand_value)
|
91
100
|
subclass_responsibility
|
92
101
|
end
|
93
102
|
|
94
|
-
def widen_domain!(
|
103
|
+
def widen_domain!(operator, operand_value)
|
95
104
|
subclass_responsibility
|
96
105
|
end
|
97
106
|
|
@@ -370,6 +379,19 @@ module C #:nodoc:
|
|
370
379
|
!@domain.empty?
|
371
380
|
end
|
372
381
|
|
382
|
+
def definite?
|
383
|
+
@domain.kind_of?(EqualToValueDomain)
|
384
|
+
end
|
385
|
+
|
386
|
+
def contain?(value)
|
387
|
+
case single_value = value.to_single_value
|
388
|
+
when ScalarValue
|
389
|
+
@domain.contain?(single_value.domain)
|
390
|
+
else
|
391
|
+
false
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
373
395
|
def undefined?
|
374
396
|
@domain.undefined?
|
375
397
|
end
|
@@ -387,22 +409,22 @@ module C #:nodoc:
|
|
387
409
|
end
|
388
410
|
end
|
389
411
|
|
390
|
-
def narrow_domain!(
|
412
|
+
def narrow_domain!(operator, operand_value)
|
391
413
|
case operand_single_value = operand_value.to_single_value
|
392
414
|
when ScalarValue
|
393
415
|
orig_domain = @domain
|
394
|
-
@domain = @domain.narrow(
|
416
|
+
@domain = @domain.narrow(operator, operand_single_value.domain)
|
395
417
|
!@domain.equal?(orig_domain)
|
396
418
|
else
|
397
419
|
raise TypeError, "cannot narrow scalar value domain with non-scalar."
|
398
420
|
end
|
399
421
|
end
|
400
422
|
|
401
|
-
def widen_domain!(
|
423
|
+
def widen_domain!(operator, operand_value)
|
402
424
|
case operand_single_value = operand_value.to_single_value
|
403
425
|
when ScalarValue
|
404
426
|
orig_domain = @domain
|
405
|
-
@domain = @domain.widen(
|
427
|
+
@domain = @domain.widen(operator, operand_single_value.domain)
|
406
428
|
!@domain.equal?(orig_domain)
|
407
429
|
else
|
408
430
|
raise TypeError, "cannot widen scalar value domain with non-scalar."
|
@@ -605,7 +627,7 @@ module C #:nodoc:
|
|
605
627
|
when ScalarValue
|
606
628
|
comp_result = (self == single_value)
|
607
629
|
single_value.invert_domain!
|
608
|
-
single_value.narrow_domain!(
|
630
|
+
single_value.narrow_domain!(Operator::EQ, self)
|
609
631
|
comp_result.domain.intersect?(ScalarValue.of_true.domain) &&
|
610
632
|
!comp_result.domain.contain?(ScalarValue.of_false.domain) &&
|
611
633
|
!@domain.intersect?(single_value.domain)
|
@@ -752,6 +774,25 @@ module C #:nodoc:
|
|
752
774
|
@values.empty? ? true : @values.all? { |value| value.exist? }
|
753
775
|
end
|
754
776
|
|
777
|
+
def definite?
|
778
|
+
@values.empty? ? true : @values.all? { |value| value.definite? }
|
779
|
+
end
|
780
|
+
|
781
|
+
def contain?(value)
|
782
|
+
case single_value = value.to_single_value
|
783
|
+
when ArrayValue
|
784
|
+
if @values.size == single_value.values.size
|
785
|
+
@values.zip(single_value.values).all? do |lhs, rhs|
|
786
|
+
lhs.contain?(rhs)
|
787
|
+
end
|
788
|
+
else
|
789
|
+
false
|
790
|
+
end
|
791
|
+
else
|
792
|
+
false
|
793
|
+
end
|
794
|
+
end
|
795
|
+
|
755
796
|
def undefined?
|
756
797
|
@values.empty? ? false : @values.all? { |value| value.undefined? }
|
757
798
|
end
|
@@ -771,12 +812,12 @@ module C #:nodoc:
|
|
771
812
|
end
|
772
813
|
end
|
773
814
|
|
774
|
-
def narrow_domain!(
|
815
|
+
def narrow_domain!(operator, operand_value)
|
775
816
|
case operand_single_value = operand_value.to_single_value
|
776
817
|
when ArrayValue
|
777
818
|
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
778
819
|
if rhs
|
779
|
-
lhs.narrow_domain!(
|
820
|
+
lhs.narrow_domain!(operator, rhs)
|
780
821
|
else
|
781
822
|
next
|
782
823
|
end
|
@@ -786,12 +827,12 @@ module C #:nodoc:
|
|
786
827
|
end
|
787
828
|
end
|
788
829
|
|
789
|
-
def widen_domain!(
|
830
|
+
def widen_domain!(operator, operand_value)
|
790
831
|
case operand_single_value = operand_value.to_single_value
|
791
832
|
when ArrayValue
|
792
833
|
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
793
834
|
if rhs
|
794
|
-
lhs.widen_domain!(
|
835
|
+
lhs.widen_domain!(operator, rhs)
|
795
836
|
else
|
796
837
|
next
|
797
838
|
end
|
@@ -1227,6 +1268,25 @@ module C #:nodoc:
|
|
1227
1268
|
@values.empty? ? true : @values.all? { |value| value.exist? }
|
1228
1269
|
end
|
1229
1270
|
|
1271
|
+
def definite?
|
1272
|
+
@values.empty? ? true : @values.all? { |value| value.definite? }
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
def contain?(value)
|
1276
|
+
case single_value = value.to_single_value
|
1277
|
+
when CompositeValue
|
1278
|
+
if @values.size == single_value.values.size
|
1279
|
+
@values.zip(single_value.values).all? do |lhs, rhs|
|
1280
|
+
lhs.contain?(rhs)
|
1281
|
+
end
|
1282
|
+
else
|
1283
|
+
false
|
1284
|
+
end
|
1285
|
+
else
|
1286
|
+
false
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
|
1230
1290
|
def undefined?
|
1231
1291
|
@values.empty? ? false : @values.all? { |value| value.undefined? }
|
1232
1292
|
end
|
@@ -1246,12 +1306,12 @@ module C #:nodoc:
|
|
1246
1306
|
end
|
1247
1307
|
end
|
1248
1308
|
|
1249
|
-
def narrow_domain!(
|
1309
|
+
def narrow_domain!(operator, operand_value)
|
1250
1310
|
case operand_single_value = operand_value.to_single_value
|
1251
1311
|
when CompositeValue
|
1252
1312
|
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
1253
1313
|
if rhs
|
1254
|
-
lhs.narrow_domain!(
|
1314
|
+
lhs.narrow_domain!(operator, rhs)
|
1255
1315
|
else
|
1256
1316
|
next
|
1257
1317
|
end
|
@@ -1262,12 +1322,12 @@ module C #:nodoc:
|
|
1262
1322
|
end
|
1263
1323
|
end
|
1264
1324
|
|
1265
|
-
def widen_domain!(
|
1325
|
+
def widen_domain!(operator, operand_value)
|
1266
1326
|
case operand_single_value = operand_value.to_single_value
|
1267
1327
|
when CompositeValue
|
1268
1328
|
@values.zip(operand_single_value.values).map { |lhs, rhs|
|
1269
1329
|
if rhs
|
1270
|
-
lhs.widen_domain!(
|
1330
|
+
lhs.widen_domain!(operator, rhs)
|
1271
1331
|
else
|
1272
1332
|
next
|
1273
1333
|
end
|
@@ -1671,6 +1731,17 @@ module C #:nodoc:
|
|
1671
1731
|
effective_values.any? { |multi_value| multi_value.base_value.exist? }
|
1672
1732
|
end
|
1673
1733
|
|
1734
|
+
def definite?
|
1735
|
+
effective_values.all? { |multi_value| multi_value.base_value.definite? }
|
1736
|
+
end
|
1737
|
+
|
1738
|
+
def contain?(value)
|
1739
|
+
single_value = value.to_single_value
|
1740
|
+
effective_values.all? do |multi_value|
|
1741
|
+
multi_value.base_value.contain?(single_value)
|
1742
|
+
end
|
1743
|
+
end
|
1744
|
+
|
1674
1745
|
def multiple?
|
1675
1746
|
true
|
1676
1747
|
end
|
@@ -1682,27 +1753,25 @@ module C #:nodoc:
|
|
1682
1753
|
end
|
1683
1754
|
end
|
1684
1755
|
|
1685
|
-
def narrow_domain!(
|
1756
|
+
def narrow_domain!(operator, operand_value)
|
1686
1757
|
operand_single_value = operand_value.to_single_value
|
1687
1758
|
effective_values.map { |multi_value|
|
1688
1759
|
if ancestor = multi_value.ancestor
|
1689
|
-
ancestor.base_value.narrow_domain!(
|
1760
|
+
ancestor.base_value.narrow_domain!(operator.for_complement,
|
1690
1761
|
operand_single_value)
|
1691
1762
|
end
|
1692
|
-
multi_value.base_value.narrow_domain!(
|
1693
|
-
operand_single_value)
|
1763
|
+
multi_value.base_value.narrow_domain!(operator, operand_single_value)
|
1694
1764
|
}.any?
|
1695
1765
|
end
|
1696
1766
|
|
1697
|
-
def widen_domain!(
|
1767
|
+
def widen_domain!(operator, operand_value)
|
1698
1768
|
operand_single_value = operand_value.to_single_value
|
1699
1769
|
effective_values.map { |multi_value|
|
1700
1770
|
if ancestor = multi_value.ancestor
|
1701
|
-
ancestor.base_value.narrow_domain!(
|
1771
|
+
ancestor.base_value.narrow_domain!(operator.for_complement,
|
1702
1772
|
operand_single_value)
|
1703
1773
|
end
|
1704
|
-
multi_value.base_value.widen_domain!(
|
1705
|
-
operand_single_value)
|
1774
|
+
multi_value.base_value.widen_domain!(operator, operand_single_value)
|
1706
1775
|
}.any?
|
1707
1776
|
end
|
1708
1777
|
|
@@ -2047,13 +2116,13 @@ module C #:nodoc:
|
|
2047
2116
|
invalidate_memo!
|
2048
2117
|
end
|
2049
2118
|
|
2050
|
-
def narrow_domain!(
|
2119
|
+
def narrow_domain!(operator, operand_value)
|
2051
2120
|
@version_controller.fork_current_version
|
2052
2121
|
super
|
2053
2122
|
invalidate_memo!
|
2054
2123
|
end
|
2055
2124
|
|
2056
|
-
def widen_domain!(
|
2125
|
+
def widen_domain!(operator, operand_value)
|
2057
2126
|
@version_controller.fork_current_version
|
2058
2127
|
super
|
2059
2128
|
invalidate_memo!
|
@@ -2326,6 +2395,8 @@ module C #:nodoc:
|
|
2326
2395
|
def_delegator :@versioned_value, :composite?
|
2327
2396
|
def_delegator :@versioned_value, :undefined?
|
2328
2397
|
def_delegator :@versioned_value, :exist?
|
2398
|
+
def_delegator :@versioned_value, :definite?
|
2399
|
+
def_delegator :@versioned_value, :contain?
|
2329
2400
|
def_delegator :@versioned_value, :multiple?
|
2330
2401
|
def_delegator :@versioned_value, :enter_versioning_group
|
2331
2402
|
def_delegator :@versioned_value, :leave_versioning_group
|
data/lib/adlint/c.rb
CHANGED
data/lib/adlint/prelude.rb
CHANGED
@@ -34,6 +34,12 @@ module Kernel
|
|
34
34
|
def subclass_responsibility
|
35
35
|
raise NotImplementedError, self.class.name
|
36
36
|
end
|
37
|
+
module_function :subclass_responsibility
|
38
|
+
|
39
|
+
def __NOTREACHED__
|
40
|
+
raise "NOTREACHED"
|
41
|
+
end
|
42
|
+
module_function :__NOTREACHED__
|
37
43
|
|
38
44
|
def print_elapsed_time(io)
|
39
45
|
tms = Process.times
|
@@ -58,7 +64,7 @@ end
|
|
58
64
|
class Module
|
59
65
|
# NOTE: Module.private_constant is added in Ruby 1.9.3-p0.
|
60
66
|
unless public_instance_methods.include?(:private_constant)
|
61
|
-
def private_constant(*
|
67
|
+
def private_constant(*) end
|
62
68
|
end
|
63
69
|
end
|
64
70
|
|
@@ -120,20 +126,6 @@ class Integer
|
|
120
126
|
end
|
121
127
|
end
|
122
128
|
|
123
|
-
class Symbol
|
124
|
-
INVERSION_TABLE = {
|
125
|
-
:== => :!=, :!= => :==, :< => :>=, :> => :<=, :<= => :>, :>= => :<
|
126
|
-
}
|
127
|
-
|
128
|
-
def invert
|
129
|
-
if result = INVERSION_TABLE[self]
|
130
|
-
result
|
131
|
-
else
|
132
|
-
self
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
129
|
class Pathname
|
138
130
|
def components
|
139
131
|
self.each_filename.to_a
|
@@ -283,9 +275,15 @@ class SuffixArray < Array
|
|
283
275
|
def create_substring_pairs(index, length)
|
284
276
|
base_suffix = self[index][0]
|
285
277
|
|
286
|
-
|
287
|
-
lambda { |lhs, rhs, len|
|
288
|
-
|
278
|
+
if base_suffix.lhs?
|
279
|
+
create_entry = lambda { |lhs, rhs, len|
|
280
|
+
SubstringPair.new(lhs, rhs, len)
|
281
|
+
}
|
282
|
+
else
|
283
|
+
create_entry = lambda { |rhs, lhs, len|
|
284
|
+
SubstringPair.new(lhs, rhs, len)
|
285
|
+
}
|
286
|
+
end
|
289
287
|
|
290
288
|
result = []
|
291
289
|
|
data/lib/adlint/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
<html lang="ja">
|
2
2
|
<head>
|
3
|
-
<title>AdLint 1.
|
3
|
+
<title>AdLint 1.12.0 開発者ガイド</title>
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
-
<meta name="description" content="AdLint 1.
|
5
|
+
<meta name="description" content="AdLint 1.12.0 開発者ガイド">
|
6
6
|
<meta name="generator" content="makeinfo 4.13">
|
7
7
|
<link title="Top" rel="top" href="#Top">
|
8
8
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
|
|
44
44
|
--></style>
|
45
45
|
</head>
|
46
46
|
<body>
|
47
|
-
<h1 class="settitle">AdLint 1.
|
47
|
+
<h1 class="settitle">AdLint 1.12.0 開発者ガイド</h1>
|
48
48
|
<div class="contents">
|
49
49
|
<h2>Table of Contents</h2>
|
50
50
|
<ul>
|
@@ -95,11 +95,17 @@ along with AdLint. If not, see <<a href="http://www.gnu.org/licenses/">http:
|
|
95
95
|
|
96
96
|
<p><table summary=""><tr align="left"><th valign="top" width="10%">名称 </th><th valign="top" width="10%">バージョン </th><th valign="top" width="30%">用途
|
97
97
|
<br></th></tr><tr align="left"><td valign="top" width="10%"><a href="http://www.ruby-lang.org/">Ruby</a>
|
98
|
-
</td><td valign="top" width="10%"><code>1.9.3-
|
98
|
+
</td><td valign="top" width="10%"><code>1.9.3-p194</code>
|
99
99
|
</td><td valign="top" width="30%">ベースとなる実装言語
|
100
100
|
<br></td></tr><tr align="left"><td valign="top" width="10%"><a href="http://rubyforge.org/projects/racc/">Racc</a>
|
101
|
-
</td><td valign="top" width="10%"><code>1.4.
|
101
|
+
</td><td valign="top" width="10%"><code>1.4.8</code>
|
102
102
|
</td><td valign="top" width="30%">構文解析器の生成
|
103
|
+
<br></td></tr><tr align="left"><td valign="top" width="10%"><a href="http://rspec.info/">RSpec</a>
|
104
|
+
</td><td valign="top" width="10%"><code>2.10.0</code>
|
105
|
+
</td><td valign="top" width="30%">単体仕様の記述と回帰テスト
|
106
|
+
<br></td></tr><tr align="left"><td valign="top" width="10%"><a href="http://cukes.info/">Cucumber</a>
|
107
|
+
</td><td valign="top" width="10%"><code>1.2.0</code>
|
108
|
+
</td><td valign="top" width="30%">機能仕様の記述と回帰テスト
|
103
109
|
<br></td></tr></table>
|
104
110
|
|
105
111
|
<h3 class="unnumberedsec">文書化環境</h3>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
@setfilename developers_guide_ja.info
|
3
3
|
@documentlanguage ja
|
4
4
|
@documentencoding utf-8
|
5
|
-
@settitle AdLint 1.
|
5
|
+
@settitle AdLint 1.12.0 開発者ガイド
|
6
6
|
|
7
7
|
@copying
|
8
8
|
Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
|
@@ -41,11 +41,17 @@ along with AdLint. If not, see <@uref{http://www.gnu.org/licenses/}>.
|
|
41
41
|
@multitable @columnfractions .1 .1 .3
|
42
42
|
@headitem 名称 @tab バージョン @tab 用途
|
43
43
|
@item @uref{http://www.ruby-lang.org/, Ruby}
|
44
|
-
@tab @code{1.9.3-
|
44
|
+
@tab @code{1.9.3-p194}
|
45
45
|
@tab ベースとなる実装言語
|
46
46
|
@item @uref{http://rubyforge.org/projects/racc/, Racc}
|
47
|
-
@tab @code{1.4.
|
47
|
+
@tab @code{1.4.8}
|
48
48
|
@tab 構文解析器の生成
|
49
|
+
@item @uref{http://rspec.info/, RSpec}
|
50
|
+
@tab @code{2.10.0}
|
51
|
+
@tab 単体仕様の記述と回帰テスト
|
52
|
+
@item @uref{http://cukes.info/, Cucumber}
|
53
|
+
@tab @code{1.2.0}
|
54
|
+
@tab 機能仕様の記述と回帰テスト
|
49
55
|
@end multitable
|
50
56
|
|
51
57
|
@unnumberedsec 文書化環境
|