adlint 1.6.0 → 1.8.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 +389 -37
- data/INSTALL +3 -0
- data/MANIFEST +7 -0
- data/NEWS +50 -10
- data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +1 -1
- data/etc/mesg.d/en_US/messages.yml +7 -7
- data/etc/mesg.d/ja_JP/messages.yml +4 -4
- data/lib/adlint/c/branch.rb +4 -4
- data/lib/adlint/c/code.rb +11 -13
- data/lib/adlint/c/enum.rb +0 -2
- data/lib/adlint/c/environ.rb +13 -7
- data/lib/adlint/c/expr.rb +5 -1
- data/lib/adlint/c/interp.rb +10 -6
- data/lib/adlint/c/mediator.rb +1 -0
- data/lib/adlint/c/message.rb +294 -111
- data/lib/adlint/c/message_shima.rb +63 -0
- data/lib/adlint/c/metric.rb +25 -13
- data/lib/adlint/c/object.rb +168 -31
- data/lib/adlint/c/parser.rb +3 -3
- data/lib/adlint/c/phase.rb +20 -3
- data/lib/adlint/c/syntax.rb +175 -17
- data/lib/adlint/c/value.rb +199 -126
- data/lib/adlint/cpp/asm.rb +4 -4
- data/lib/adlint/cpp/constexpr.rb +1 -1
- data/lib/adlint/cpp/eval.rb +6 -4
- data/lib/adlint/cpp/message.rb +100 -7
- data/lib/adlint/cpp/phase.rb +12 -1
- data/lib/adlint/cpp/source.rb +2 -2
- data/lib/adlint/cpp/subst.rb +2 -4
- data/lib/adlint/lang.rb +5 -3
- data/lib/adlint/ld/metric.rb +1 -1
- data/lib/adlint/version.rb +2 -2
- data/share/demo/Makefile +5 -0
- data/share/demo/bad_include/bad_include.c +13 -0
- data/share/demo/bad_include/test'1'.h +0 -0
- data/share/demo/bad_include/test'2'.h +0 -0
- data/share/demo/incomplete_ifelse/incomplete_ifelse.c +29 -0
- data/share/demo/inline_asm/inline_asm.c +25 -0
- data/share/demo/invalid_call/invalid_call.c +12 -4
- data/share/demo/logical_expr/logical_expr.c +73 -0
- data/share/demo/register_vars/register_vars.c +12 -0
- data/share/demo/typedef_each_src/typedef_each_src.c +9 -0
- data/share/demo/wrap_around/wrap_around.c +17 -0
- 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 +137 -102
- data/share/doc/users_guide_en.texi +121 -86
- data/share/doc/users_guide_ja.html +118 -91
- data/share/doc/users_guide_ja.texi +103 -76
- metadata +10 -3
data/lib/adlint/c/value.rb
CHANGED
@@ -749,15 +749,15 @@ module C #:nodoc:
|
|
749
749
|
end
|
750
750
|
|
751
751
|
def exist?
|
752
|
-
@values.all? { |value| value.exist? }
|
752
|
+
@values.empty? ? true : @values.all? { |value| value.exist? }
|
753
753
|
end
|
754
754
|
|
755
755
|
def undefined?
|
756
|
-
@values.all? { |value| value.undefined? }
|
756
|
+
@values.empty? ? false : @values.all? { |value| value.undefined? }
|
757
757
|
end
|
758
758
|
|
759
759
|
def ambiguous?
|
760
|
-
@values.all? { |value| value.ambiguous? }
|
760
|
+
@values.empty? ? false : @values.all? { |value| value.ambiguous? }
|
761
761
|
end
|
762
762
|
|
763
763
|
def overwrite!(value)
|
@@ -1224,15 +1224,15 @@ module C #:nodoc:
|
|
1224
1224
|
end
|
1225
1225
|
|
1226
1226
|
def exist?
|
1227
|
-
@values.all? { |value| value.exist? }
|
1227
|
+
@values.empty? ? true : @values.all? { |value| value.exist? }
|
1228
1228
|
end
|
1229
1229
|
|
1230
1230
|
def undefined?
|
1231
|
-
@values.all? { |value| value.undefined? }
|
1231
|
+
@values.empty? ? false : @values.all? { |value| value.undefined? }
|
1232
1232
|
end
|
1233
1233
|
|
1234
1234
|
def ambiguous?
|
1235
|
-
@values.all? { |value| value.ambiguous? }
|
1235
|
+
@values.empty? ? false : @values.all? { |value| value.ambiguous? }
|
1236
1236
|
end
|
1237
1237
|
|
1238
1238
|
def overwrite!(value)
|
@@ -1717,9 +1717,16 @@ module C #:nodoc:
|
|
1717
1717
|
end
|
1718
1718
|
|
1719
1719
|
def fork
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1720
|
+
same_value = @descendants.find { |multi_value|
|
1721
|
+
multi_value.eql?(@base_value)
|
1722
|
+
}
|
1723
|
+
if same_value
|
1724
|
+
same_value
|
1725
|
+
else
|
1726
|
+
new_descendant = MultipleValue.new(@base_value.dup, self)
|
1727
|
+
@descendants.push(new_descendant)
|
1728
|
+
new_descendant
|
1729
|
+
end
|
1723
1730
|
end
|
1724
1731
|
|
1725
1732
|
def rollback!
|
@@ -1998,12 +2005,12 @@ module C #:nodoc:
|
|
1998
2005
|
@version_controller = ValueVersionController.new(self)
|
1999
2006
|
end
|
2000
2007
|
|
2001
|
-
def
|
2008
|
+
def enter_versioning_group
|
2002
2009
|
@version_controller.enter_new_versioning_group
|
2003
2010
|
end
|
2004
2011
|
|
2005
|
-
def
|
2006
|
-
@version_controller.copy_current_version if
|
2012
|
+
def leave_versioning_group(raise_complement)
|
2013
|
+
@version_controller.copy_current_version if raise_complement
|
2007
2014
|
@version_controller.merge_forked_versions
|
2008
2015
|
@version_controller.leave_current_versioning_group
|
2009
2016
|
invalidate_memo!
|
@@ -2018,58 +2025,44 @@ module C #:nodoc:
|
|
2018
2025
|
invalidate_memo!
|
2019
2026
|
end
|
2020
2027
|
|
2021
|
-
|
2022
|
-
|
2023
|
-
def rollback!
|
2028
|
+
def rollback_latest_version!
|
2024
2029
|
if @version_controller.rollback
|
2025
2030
|
invalidate_memo!
|
2026
2031
|
end
|
2027
2032
|
end
|
2028
2033
|
|
2029
|
-
def
|
2034
|
+
def rollback_all_versions!
|
2030
2035
|
delete_descendants!
|
2031
|
-
|
2036
|
+
_orig_overwrite!(@version_controller.original_value)
|
2032
2037
|
@version_controller = ValueVersionController.new(self)
|
2033
2038
|
invalidate_memo!
|
2034
2039
|
end
|
2035
2040
|
|
2036
|
-
alias :
|
2041
|
+
alias :_orig_overwrite! :overwrite!
|
2037
2042
|
|
2038
2043
|
def overwrite!(value)
|
2039
|
-
|
2040
|
-
|
2041
|
-
|
2042
|
-
|
2043
|
-
unless no_effect
|
2044
|
-
@version_controller.fork_new_version
|
2045
|
-
super(single_value)
|
2046
|
-
@version_controller.mark_current_versioning_group_as_sticky
|
2047
|
-
invalidate_memo!
|
2048
|
-
end
|
2044
|
+
@version_controller.fork_current_version
|
2045
|
+
super(value.to_single_value)
|
2046
|
+
@version_controller.mark_current_versioning_group_as_sticky
|
2047
|
+
invalidate_memo!
|
2049
2048
|
end
|
2050
2049
|
|
2051
2050
|
def narrow_domain!(operator_symbol, operand_value)
|
2052
|
-
|
2053
|
-
|
2054
|
-
|
2055
|
-
invalidate_memo!
|
2056
|
-
end
|
2051
|
+
@version_controller.fork_current_version
|
2052
|
+
super
|
2053
|
+
invalidate_memo!
|
2057
2054
|
end
|
2058
2055
|
|
2059
2056
|
def widen_domain!(operator_symbol, operand_value)
|
2060
|
-
|
2061
|
-
|
2062
|
-
|
2063
|
-
invalidate_memo!
|
2064
|
-
end
|
2057
|
+
@version_controller.fork_current_version
|
2058
|
+
super
|
2059
|
+
invalidate_memo!
|
2065
2060
|
end
|
2066
2061
|
|
2067
2062
|
def invert_domain!
|
2068
|
-
|
2069
|
-
|
2070
|
-
|
2071
|
-
invalidate_memo!
|
2072
|
-
end
|
2063
|
+
@version_controller.fork_current_version
|
2064
|
+
super
|
2065
|
+
invalidate_memo!
|
2073
2066
|
end
|
2074
2067
|
|
2075
2068
|
def coerce_to(type)
|
@@ -2097,77 +2090,56 @@ module C #:nodoc:
|
|
2097
2090
|
end
|
2098
2091
|
|
2099
2092
|
class ValueVersionController
|
2100
|
-
VersioningGroup = Struct.new(:sticky, :original_values)
|
2101
|
-
Version = Struct.new(:group, :state, :values)
|
2102
|
-
|
2103
2093
|
def initialize(original_value)
|
2104
|
-
@
|
2105
|
-
@versions = [initial_version(@versioning_groups.first, original_value)]
|
2094
|
+
@versioning_group_stack = [RootVersioningGroup.new(original_value)]
|
2106
2095
|
end
|
2107
2096
|
|
2108
|
-
def
|
2109
|
-
|
2097
|
+
def original_value
|
2098
|
+
root_versioning_group.initial_values.first
|
2110
2099
|
end
|
2111
2100
|
|
2112
2101
|
def current_values
|
2113
|
-
|
2102
|
+
current_versioning_group.current_values
|
2114
2103
|
end
|
2115
2104
|
|
2116
2105
|
def enter_new_versioning_group
|
2117
|
-
|
2118
|
-
|
2119
|
-
}
|
2120
|
-
VersioningGroup.new(false, original_values).tap do |group|
|
2121
|
-
@versioning_groups.push(group)
|
2122
|
-
end
|
2106
|
+
new_group = VersioningGroup.new(current_versioning_group.current_version)
|
2107
|
+
@versioning_group_stack.push(new_group)
|
2123
2108
|
end
|
2124
2109
|
|
2125
2110
|
def leave_current_versioning_group
|
2126
|
-
@
|
2111
|
+
@versioning_group_stack.pop
|
2127
2112
|
end
|
2128
2113
|
|
2129
2114
|
def begin_forking
|
2130
|
-
|
2131
|
-
:forking, current_version.values))
|
2115
|
+
current_versioning_group.begin_new_version
|
2132
2116
|
end
|
2133
2117
|
|
2134
2118
|
def end_forking
|
2135
|
-
|
2119
|
+
current_versioning_group.end_current_version
|
2136
2120
|
end
|
2137
2121
|
|
2138
|
-
def
|
2139
|
-
|
2140
|
-
fork_all_base_versions
|
2141
|
-
current_version.values = current_version.values.map { |multi_value|
|
2142
|
-
multi_value.fork
|
2143
|
-
}
|
2144
|
-
current_version.state = :forked
|
2145
|
-
end
|
2122
|
+
def fork_current_version
|
2123
|
+
fork_all_versions
|
2146
2124
|
end
|
2147
2125
|
|
2148
2126
|
def rollback
|
2127
|
+
return false unless current_version.forked?
|
2128
|
+
|
2149
2129
|
# NOTE: This method must be called in the forking section.
|
2150
|
-
|
2151
|
-
|
2152
|
-
|
2153
|
-
case multi_value
|
2154
|
-
when VersionedValue
|
2155
|
-
multi_value._rollback_latest_version!
|
2156
|
-
else
|
2157
|
-
multi_value.rollback!
|
2158
|
-
end
|
2159
|
-
end
|
2160
|
-
begin_forking
|
2161
|
-
mark_current_versioning_group_as_sticky
|
2162
|
-
true
|
2163
|
-
else
|
2164
|
-
false
|
2130
|
+
current_versioning_group.delete_current_version
|
2131
|
+
current_versioning_group.base_values.each do |multi_value|
|
2132
|
+
multi_value.rollback!
|
2165
2133
|
end
|
2134
|
+
begin_forking
|
2135
|
+
mark_current_versioning_group_as_sticky
|
2136
|
+
|
2137
|
+
true
|
2166
2138
|
end
|
2167
2139
|
|
2168
2140
|
def mark_current_versioning_group_as_sticky
|
2169
|
-
@
|
2170
|
-
if group.sticky
|
2141
|
+
@versioning_group_stack.reverse_each do |group|
|
2142
|
+
if group.sticky?
|
2171
2143
|
break
|
2172
2144
|
else
|
2173
2145
|
group.sticky = true
|
@@ -2176,69 +2148,170 @@ module C #:nodoc:
|
|
2176
2148
|
end
|
2177
2149
|
|
2178
2150
|
def copy_current_version
|
2151
|
+
return unless current_versioning_group.sticky?
|
2152
|
+
|
2179
2153
|
# NOTE: This method must be called between ending of the forking section
|
2180
2154
|
# and ending of the versioning group.
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2186
|
-
|
2187
|
-
|
2188
|
-
end
|
2155
|
+
current_values.each do |multi_value|
|
2156
|
+
base_value = multi_value.base_value
|
2157
|
+
already_exist = multi_value.descendants.any? { |desc_multi_value|
|
2158
|
+
!desc_multi_value.equal?(multi_value) &&
|
2159
|
+
desc_multi_value.eql?(base_value)
|
2160
|
+
}
|
2161
|
+
multi_value.fork unless already_exist
|
2189
2162
|
end
|
2190
2163
|
end
|
2191
2164
|
|
2192
2165
|
def merge_forked_versions
|
2193
2166
|
# NOTE: This method must be called between ending of the forking section
|
2194
2167
|
# and ending of the versioning group.
|
2195
|
-
|
2196
|
-
|
2197
|
-
|
2168
|
+
base_version = current_versioning_group.base_version
|
2169
|
+
|
2170
|
+
case
|
2171
|
+
when current_versioning_group.sticky?
|
2172
|
+
fork_all_versions
|
2173
|
+
base_version.values = base_version.values.map { |base_multi_value|
|
2174
|
+
base_multi_value.descendants
|
2198
2175
|
}.flatten.uniq
|
2199
|
-
|
2200
|
-
|
2201
|
-
|
2202
|
-
|
2203
|
-
|
2204
|
-
|
2205
|
-
|
2176
|
+
when current_versioning_group.versions_forked?
|
2177
|
+
# NOTE: When versions in the current versioning group have been forked,
|
2178
|
+
# base_version of the current versioning group has already been
|
2179
|
+
# forked. So, it is safe to overwrite the base_version's values
|
2180
|
+
# with the current versioning group's initial snapshot values.
|
2181
|
+
initial_values = current_versioning_group.initial_values
|
2182
|
+
values = base_version.values.zip(initial_values)
|
2183
|
+
values.each do |base_multi_value, initial_single_value|
|
2184
|
+
base_multi_value.delete_descendants!
|
2185
|
+
if base_multi_value.kind_of?(VersionedValue)
|
2186
|
+
base_multi_value._orig_overwrite!(initial_single_value)
|
2206
2187
|
else
|
2207
|
-
|
2188
|
+
base_multi_value.overwrite!(initial_single_value)
|
2208
2189
|
end
|
2209
2190
|
end
|
2191
|
+
else
|
2192
|
+
# NOTE: Nothing to be done when base_version of the current versioning
|
2193
|
+
# group has not been forked.
|
2210
2194
|
end
|
2211
2195
|
end
|
2212
2196
|
|
2213
2197
|
private
|
2214
|
-
def
|
2215
|
-
|
2198
|
+
def fork_all_versions
|
2199
|
+
parent_group = root_versioning_group
|
2200
|
+
active_versioning_groups.each do |active_group|
|
2201
|
+
active_group.base_version = parent_group.current_version
|
2202
|
+
active_group.fork_all_versions
|
2203
|
+
parent_group = active_group
|
2204
|
+
end
|
2216
2205
|
end
|
2217
2206
|
|
2218
|
-
def
|
2219
|
-
|
2207
|
+
def root_versioning_group
|
2208
|
+
@versioning_group_stack.first
|
2220
2209
|
end
|
2221
2210
|
|
2222
|
-
def
|
2223
|
-
|
2224
|
-
@versions[1..-2].each do |version|
|
2225
|
-
if version.state == :forking
|
2226
|
-
version.values = base_version.values.map { |multi_value|
|
2227
|
-
multi_value.fork
|
2228
|
-
}
|
2229
|
-
version.state = :forked
|
2230
|
-
end
|
2231
|
-
base_version = version
|
2232
|
-
end
|
2211
|
+
def active_versioning_groups
|
2212
|
+
@versioning_group_stack[1..-1]
|
2233
2213
|
end
|
2234
2214
|
|
2235
2215
|
def current_versioning_group
|
2236
|
-
@
|
2216
|
+
@versioning_group_stack.last
|
2237
2217
|
end
|
2238
2218
|
|
2239
2219
|
def current_version
|
2240
|
-
|
2220
|
+
current_versioning_group.current_version
|
2221
|
+
end
|
2222
|
+
|
2223
|
+
class VersioningGroup
|
2224
|
+
def initialize(base_version, sticky = false)
|
2225
|
+
@base_version = base_version
|
2226
|
+
@sticky = sticky
|
2227
|
+
|
2228
|
+
@initial_values = base_version.values.map { |multi_value|
|
2229
|
+
multi_value.base_value.dup
|
2230
|
+
}
|
2231
|
+
@version_stack = []
|
2232
|
+
@all_versions = []
|
2233
|
+
end
|
2234
|
+
|
2235
|
+
attr_accessor :base_version
|
2236
|
+
attr_writer :sticky
|
2237
|
+
attr_reader :initial_values
|
2238
|
+
|
2239
|
+
def sticky?
|
2240
|
+
@sticky
|
2241
|
+
end
|
2242
|
+
|
2243
|
+
def versions_forked?
|
2244
|
+
@all_versions.any? { |version| version.forked? }
|
2245
|
+
end
|
2246
|
+
|
2247
|
+
def base_values
|
2248
|
+
@base_version.values
|
2249
|
+
end
|
2250
|
+
|
2251
|
+
def current_version
|
2252
|
+
@version_stack.empty? ? @base_version : @version_stack.last
|
2253
|
+
end
|
2254
|
+
|
2255
|
+
def current_values
|
2256
|
+
current_version.values
|
2257
|
+
end
|
2258
|
+
|
2259
|
+
def begin_new_version
|
2260
|
+
new_version = Version.new(base_values)
|
2261
|
+
@version_stack.push(new_version)
|
2262
|
+
@all_versions.push(new_version)
|
2263
|
+
end
|
2264
|
+
|
2265
|
+
def end_current_version
|
2266
|
+
@version_stack.pop
|
2267
|
+
end
|
2268
|
+
|
2269
|
+
def delete_current_version
|
2270
|
+
end_current_version
|
2271
|
+
@all_versions.pop
|
2272
|
+
end
|
2273
|
+
|
2274
|
+
def fork_all_versions
|
2275
|
+
@all_versions.each { |version| version.fork_from(@base_version) }
|
2276
|
+
end
|
2277
|
+
end
|
2278
|
+
private_constant :VersioningGroup
|
2279
|
+
|
2280
|
+
class RootVersioningGroup < VersioningGroup
|
2281
|
+
def initialize(original_value)
|
2282
|
+
super(Version.new([original_value], true), true)
|
2283
|
+
end
|
2284
|
+
end
|
2285
|
+
private_constant :RootVersioningGroup
|
2286
|
+
|
2287
|
+
class Version
|
2288
|
+
def initialize(values, original = false)
|
2289
|
+
@values = values
|
2290
|
+
@state = original ? :original : :forking
|
2291
|
+
end
|
2292
|
+
|
2293
|
+
attr_accessor :values
|
2294
|
+
|
2295
|
+
def original?
|
2296
|
+
@state == :original
|
2297
|
+
end
|
2298
|
+
|
2299
|
+
def forking?
|
2300
|
+
@state == :forking
|
2301
|
+
end
|
2302
|
+
|
2303
|
+
def forked?
|
2304
|
+
@state == :forked
|
2305
|
+
end
|
2306
|
+
|
2307
|
+
def fork_from(base_version)
|
2308
|
+
if forking?
|
2309
|
+
@values = base_version.values.map { |multi_value| multi_value.fork }
|
2310
|
+
@state = :forked
|
2311
|
+
end
|
2312
|
+
end
|
2241
2313
|
end
|
2314
|
+
private_constant :Version
|
2242
2315
|
end
|
2243
2316
|
|
2244
2317
|
class FrozenValue < Value
|
@@ -2254,12 +2327,12 @@ module C #:nodoc:
|
|
2254
2327
|
def_delegator :@versioned_value, :undefined?
|
2255
2328
|
def_delegator :@versioned_value, :exist?
|
2256
2329
|
def_delegator :@versioned_value, :multiple?
|
2257
|
-
def_delegator :@versioned_value, :
|
2258
|
-
def_delegator :@versioned_value, :
|
2330
|
+
def_delegator :@versioned_value, :enter_versioning_group
|
2331
|
+
def_delegator :@versioned_value, :leave_versioning_group
|
2259
2332
|
def_delegator :@versioned_value, :begin_versioning
|
2260
2333
|
def_delegator :@versioned_value, :end_versioning
|
2261
|
-
def_delegator :@versioned_value, :
|
2262
|
-
def_delegator :@versioned_value, :
|
2334
|
+
def_delegator :@versioned_value, :rollback_latest_version!
|
2335
|
+
def_delegator :@versioned_value, :rollback_all_versions!
|
2263
2336
|
def_delegator :@versioned_value, :single_value_unified_with
|
2264
2337
|
def_delegator :@versioned_value, :~
|
2265
2338
|
def_delegator :@versioned_value, :+@
|
data/lib/adlint/cpp/asm.rb
CHANGED
@@ -42,8 +42,8 @@ module Cpp #:nodoc:
|
|
42
42
|
|
43
43
|
def create_cxx_asm_definition(source)
|
44
44
|
CodeSubstitution.new("asm(__adlint__any);", "").tap do |subst|
|
45
|
-
subst.on_substitution += lambda { |
|
46
|
-
source.on_inline_assembly.invoke(
|
45
|
+
subst.on_substitution += lambda { |matched_tokens|
|
46
|
+
source.on_inline_assembly.invoke(matched_tokens)
|
47
47
|
}
|
48
48
|
end
|
49
49
|
end
|
@@ -61,8 +61,8 @@ module Cpp #:nodoc:
|
|
61
61
|
"asm __volatile__ (__adlint__any);"
|
62
62
|
].map do |pattern|
|
63
63
|
CodeSubstitution.new(pattern, "").tap { |subst|
|
64
|
-
subst.on_substitution += lambda { |
|
65
|
-
source.on_inline_assembly.invoke(
|
64
|
+
subst.on_substitution += lambda { |matched_tokens|
|
65
|
+
source.on_inline_assembly.invoke(matched_tokens)
|
66
66
|
}
|
67
67
|
}
|
68
68
|
end
|
data/lib/adlint/cpp/constexpr.rb
CHANGED
data/lib/adlint/cpp/eval.rb
CHANGED
@@ -648,7 +648,7 @@ module Cpp #:nodoc:
|
|
648
648
|
if fpath = resolve_next_user_header(basename, current_dpath)
|
649
649
|
include_user_header(fpath, user_include_next_line, context)
|
650
650
|
else
|
651
|
-
E(:E0010,
|
651
|
+
E(:E0010, user_include_next_line.location, basename)
|
652
652
|
raise MissingUserHeaderError.new(user_include_next_line.location,
|
653
653
|
basename,
|
654
654
|
context.msg_fpath, context.log_fpath)
|
@@ -688,7 +688,7 @@ module Cpp #:nodoc:
|
|
688
688
|
include_system_header(fpath, system_include_next_line, context)
|
689
689
|
else
|
690
690
|
E(:E0009, system_include_line.location, basename)
|
691
|
-
raise MissingSystemHeaderError.new(
|
691
|
+
raise MissingSystemHeaderError.new(system_include_next_line.location,
|
692
692
|
basename,
|
693
693
|
context.msg_fpath,
|
694
694
|
context.log_fpath)
|
@@ -723,7 +723,8 @@ module Cpp #:nodoc:
|
|
723
723
|
result = []
|
724
724
|
include_paths.each do |dpath|
|
725
725
|
fpath = dpath.join(Pathname.new(basename))
|
726
|
-
|
726
|
+
fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
|
727
|
+
result.push(fpath) if fpath.readable?
|
727
728
|
break if result.size == max_num
|
728
729
|
end
|
729
730
|
result
|
@@ -744,7 +745,8 @@ module Cpp #:nodoc:
|
|
744
745
|
result = []
|
745
746
|
include_paths.each do |dpath|
|
746
747
|
fpath = dpath.join(Pathname.new(basename))
|
747
|
-
|
748
|
+
fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
|
749
|
+
result.push(fpath) if fpath.readable?
|
748
750
|
break if result.size == max_num
|
749
751
|
end
|
750
752
|
result
|
data/lib/adlint/cpp/message.rb
CHANGED
@@ -258,8 +258,18 @@ module Cpp #:nodoc:
|
|
258
258
|
|
259
259
|
def initialize(context)
|
260
260
|
super
|
261
|
-
context[:c_source].on_language_extension +=
|
262
|
-
|
261
|
+
context[:c_source].on_language_extension += method(:check)
|
262
|
+
end
|
263
|
+
|
264
|
+
private
|
265
|
+
def check(matched_tokens)
|
266
|
+
W(:W0061, matched_tokens.first.location, tokens_to_str(matched_tokens))
|
267
|
+
end
|
268
|
+
|
269
|
+
def tokens_to_str(tokens)
|
270
|
+
tokens.map { |token|
|
271
|
+
token.type == :NEW_LINE ? nil : token.value
|
272
|
+
}.compact.join(" ")
|
263
273
|
end
|
264
274
|
end
|
265
275
|
|
@@ -772,15 +782,20 @@ module Cpp #:nodoc:
|
|
772
782
|
end
|
773
783
|
|
774
784
|
class W0541 < PassiveMessageDetection
|
775
|
-
# NOTE: W0541 may be duplicative when the same header which
|
776
|
-
#
|
777
|
-
# more.
|
785
|
+
# NOTE: W0541 may be duplicative when the same header which causes this
|
786
|
+
# warning is included twice or more.
|
778
787
|
ensure_uniqueness_of :W0541
|
779
788
|
|
780
789
|
def initialize(context)
|
781
790
|
super
|
782
|
-
context[:c_source].on_inline_assembly +=
|
783
|
-
|
791
|
+
context[:c_source].on_inline_assembly += method(:check)
|
792
|
+
end
|
793
|
+
|
794
|
+
private
|
795
|
+
def check(asm_tokens)
|
796
|
+
unless asm_tokens.any? { |token| token.replaced? }
|
797
|
+
W(:W0541, asm_tokens.first.location)
|
798
|
+
end
|
784
799
|
end
|
785
800
|
end
|
786
801
|
|
@@ -948,6 +963,68 @@ module Cpp #:nodoc:
|
|
948
963
|
end
|
949
964
|
end
|
950
965
|
|
966
|
+
class W0632 < PassiveMessageDetection
|
967
|
+
# NOTE: W0632 may be duplicative when the same header which has references
|
968
|
+
# to the undefined macro is included twice or more.
|
969
|
+
ensure_uniqueness_of :W0632
|
970
|
+
|
971
|
+
def initialize(context)
|
972
|
+
super
|
973
|
+
visitor = context[:cpp_visitor]
|
974
|
+
visitor.enter_system_include_line += method(:check)
|
975
|
+
visitor.enter_system_include_next_line += method(:check)
|
976
|
+
end
|
977
|
+
|
978
|
+
private
|
979
|
+
def check(include_line)
|
980
|
+
if include_line.header_name.value =~ /['"]/
|
981
|
+
W(:W0632, include_line.location, include_line.header_name.value)
|
982
|
+
end
|
983
|
+
end
|
984
|
+
end
|
985
|
+
|
986
|
+
class W0633 < PassiveMessageDetection
|
987
|
+
# NOTE: W0633 may be duplicative when the same header which has references
|
988
|
+
# to the undefined macro is included twice or more.
|
989
|
+
ensure_uniqueness_of :W0633
|
990
|
+
|
991
|
+
def initialize(context)
|
992
|
+
super
|
993
|
+
visitor = context[:cpp_visitor]
|
994
|
+
visitor.enter_user_include_line += method(:check)
|
995
|
+
visitor.enter_user_include_next_line += method(:check)
|
996
|
+
end
|
997
|
+
|
998
|
+
private
|
999
|
+
def check(include_line)
|
1000
|
+
if include_line.header_name.value =~ /'/
|
1001
|
+
W(:W0633, include_line.location, include_line.header_name.value)
|
1002
|
+
end
|
1003
|
+
end
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
class W0634 < PassiveMessageDetection
|
1007
|
+
# NOTE: W0634 may be duplicative when the same header which has references
|
1008
|
+
# to the undefined macro is included twice or more.
|
1009
|
+
ensure_uniqueness_of :W0634
|
1010
|
+
|
1011
|
+
def initialize(context)
|
1012
|
+
super
|
1013
|
+
visitor = context[:cpp_visitor]
|
1014
|
+
visitor.enter_user_include_line += method(:check)
|
1015
|
+
visitor.enter_user_include_next_line += method(:check)
|
1016
|
+
visitor.enter_system_include_line += method(:check)
|
1017
|
+
visitor.enter_system_include_next_line += method(:check)
|
1018
|
+
end
|
1019
|
+
|
1020
|
+
private
|
1021
|
+
def check(include_line)
|
1022
|
+
if include_line.header_name.value.include?("\\")
|
1023
|
+
W(:W0634, include_line.location)
|
1024
|
+
end
|
1025
|
+
end
|
1026
|
+
end
|
1027
|
+
|
951
1028
|
class W0696 < PassiveMessageDetection
|
952
1029
|
# NOTE: W0696 may be duplicative when the same header which has references
|
953
1030
|
# to the undefined macro is included twice or more.
|
@@ -990,6 +1067,22 @@ module Cpp #:nodoc:
|
|
990
1067
|
end
|
991
1068
|
end
|
992
1069
|
|
1070
|
+
class W0832 < PassiveMessageDetection
|
1071
|
+
# NOTE: W0832 may be duplicative when the same header which causes this
|
1072
|
+
# warning is included twice or more.
|
1073
|
+
ensure_uniqueness_of :W0832
|
1074
|
+
|
1075
|
+
def initialize(context)
|
1076
|
+
super
|
1077
|
+
context[:c_source].on_inline_assembly += method(:check)
|
1078
|
+
end
|
1079
|
+
|
1080
|
+
private
|
1081
|
+
def check(asm_tokens)
|
1082
|
+
W(:W0832, asm_tokens.first.location)
|
1083
|
+
end
|
1084
|
+
end
|
1085
|
+
|
993
1086
|
class W9002 < PassiveMessageDetection
|
994
1087
|
# NOTE: W9002 may be duplicative when the same header which has no newline
|
995
1088
|
# at end of the file is included twice or more.
|