adlint 1.6.0 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|