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/syntax.rb
CHANGED
@@ -31,7 +31,6 @@
|
|
31
31
|
|
32
32
|
require "adlint/symbol"
|
33
33
|
require "adlint/util"
|
34
|
-
require "adlint/c/enum"
|
35
34
|
require "adlint/c/seqp"
|
36
35
|
|
37
36
|
module AdLint #:nodoc:
|
@@ -226,6 +225,17 @@ module C #:nodoc:
|
|
226
225
|
end
|
227
226
|
module_function :collect_identifier_declarators
|
228
227
|
|
228
|
+
def collect_typedef_type_specifiers(node)
|
229
|
+
if node
|
230
|
+
TypedefTypeSpecifierCollector.new.tap { |collector|
|
231
|
+
node.accept(collector)
|
232
|
+
}.typedef_type_specifiers
|
233
|
+
else
|
234
|
+
[]
|
235
|
+
end
|
236
|
+
end
|
237
|
+
module_function :collect_typedef_type_specifiers
|
238
|
+
|
229
239
|
def collect_function_declarators(node)
|
230
240
|
if node
|
231
241
|
FunctionDeclaratorCollector.new.tap { |collector|
|
@@ -424,6 +434,10 @@ module C #:nodoc:
|
|
424
434
|
}.object_specifiers
|
425
435
|
end
|
426
436
|
|
437
|
+
def logical?
|
438
|
+
subclass_responsibility
|
439
|
+
end
|
440
|
+
|
427
441
|
def to_s
|
428
442
|
subclass_responsibility
|
429
443
|
end
|
@@ -443,6 +457,10 @@ module C #:nodoc:
|
|
443
457
|
true
|
444
458
|
end
|
445
459
|
|
460
|
+
def logical?
|
461
|
+
false
|
462
|
+
end
|
463
|
+
|
446
464
|
def to_s
|
447
465
|
@error_token.value
|
448
466
|
end
|
@@ -457,6 +475,10 @@ module C #:nodoc:
|
|
457
475
|
def have_side_effect?
|
458
476
|
false
|
459
477
|
end
|
478
|
+
|
479
|
+
def logical?
|
480
|
+
false
|
481
|
+
end
|
460
482
|
end
|
461
483
|
|
462
484
|
class ObjectSpecifier < PrimaryExpression
|
@@ -471,6 +493,10 @@ module C #:nodoc:
|
|
471
493
|
@identifier.location
|
472
494
|
end
|
473
495
|
|
496
|
+
def logical?
|
497
|
+
false
|
498
|
+
end
|
499
|
+
|
474
500
|
def to_s
|
475
501
|
@identifier.value
|
476
502
|
end
|
@@ -505,6 +531,10 @@ module C #:nodoc:
|
|
505
531
|
@constant.value =~ /'.*'/
|
506
532
|
end
|
507
533
|
|
534
|
+
def logical?
|
535
|
+
false
|
536
|
+
end
|
537
|
+
|
508
538
|
def to_s
|
509
539
|
@constant.value
|
510
540
|
end
|
@@ -531,6 +561,10 @@ module C #:nodoc:
|
|
531
561
|
@literal.value.scan(/\AL/i).first
|
532
562
|
end
|
533
563
|
|
564
|
+
def logical?
|
565
|
+
false
|
566
|
+
end
|
567
|
+
|
534
568
|
def to_s
|
535
569
|
@literal.value
|
536
570
|
end
|
@@ -553,6 +587,10 @@ module C #:nodoc:
|
|
553
587
|
@token.location
|
554
588
|
end
|
555
589
|
|
590
|
+
def logical?
|
591
|
+
false
|
592
|
+
end
|
593
|
+
|
556
594
|
def to_s
|
557
595
|
@token.value
|
558
596
|
end
|
@@ -579,6 +617,10 @@ module C #:nodoc:
|
|
579
617
|
@expression.have_side_effect?
|
580
618
|
end
|
581
619
|
|
620
|
+
def logical?
|
621
|
+
@expression.logical?
|
622
|
+
end
|
623
|
+
|
582
624
|
def to_s
|
583
625
|
"(#{expression.to_s})"
|
584
626
|
end
|
@@ -599,6 +641,10 @@ module C #:nodoc:
|
|
599
641
|
def location
|
600
642
|
@operator.location
|
601
643
|
end
|
644
|
+
|
645
|
+
def logical?
|
646
|
+
false
|
647
|
+
end
|
602
648
|
end
|
603
649
|
|
604
650
|
class ArraySubscriptExpression < PostfixExpression
|
@@ -849,21 +895,45 @@ module C #:nodoc:
|
|
849
895
|
def have_side_effect?
|
850
896
|
true
|
851
897
|
end
|
898
|
+
|
899
|
+
def logical?
|
900
|
+
false
|
901
|
+
end
|
852
902
|
end
|
853
903
|
|
854
904
|
class PrefixDecrementExpression < UnaryExpression
|
855
905
|
def have_side_effect?
|
856
906
|
true
|
857
907
|
end
|
908
|
+
|
909
|
+
def logical?
|
910
|
+
false
|
911
|
+
end
|
858
912
|
end
|
859
913
|
|
860
|
-
class AddressExpression < UnaryExpression
|
914
|
+
class AddressExpression < UnaryExpression
|
915
|
+
def logical?
|
916
|
+
false
|
917
|
+
end
|
918
|
+
end
|
861
919
|
|
862
|
-
class IndirectionExpression < UnaryExpression
|
920
|
+
class IndirectionExpression < UnaryExpression
|
921
|
+
def logical?
|
922
|
+
false
|
923
|
+
end
|
924
|
+
end
|
863
925
|
|
864
|
-
class UnaryArithmeticExpression < UnaryExpression
|
926
|
+
class UnaryArithmeticExpression < UnaryExpression
|
927
|
+
def logical?
|
928
|
+
@operator.type == "!"
|
929
|
+
end
|
930
|
+
end
|
865
931
|
|
866
932
|
class SizeofExpression < UnaryExpression
|
933
|
+
def logical?
|
934
|
+
false
|
935
|
+
end
|
936
|
+
|
867
937
|
def to_s
|
868
938
|
"sizeof(#{@operand.to_s})"
|
869
939
|
end
|
@@ -874,12 +944,20 @@ module C #:nodoc:
|
|
874
944
|
false
|
875
945
|
end
|
876
946
|
|
947
|
+
def logical?
|
948
|
+
false
|
949
|
+
end
|
950
|
+
|
877
951
|
def to_s
|
878
952
|
"sizeof(#{@operand.to_s})"
|
879
953
|
end
|
880
954
|
end
|
881
955
|
|
882
956
|
class AlignofExpression < UnaryExpression
|
957
|
+
def logical?
|
958
|
+
false
|
959
|
+
end
|
960
|
+
|
883
961
|
def to_s
|
884
962
|
"alignof(#{@operand.to_s})"
|
885
963
|
end
|
@@ -890,6 +968,10 @@ module C #:nodoc:
|
|
890
968
|
false
|
891
969
|
end
|
892
970
|
|
971
|
+
def logical?
|
972
|
+
false
|
973
|
+
end
|
974
|
+
|
893
975
|
def to_s
|
894
976
|
"alignof(#{@operand.to_s})"
|
895
977
|
end
|
@@ -913,6 +995,10 @@ module C #:nodoc:
|
|
913
995
|
@operand.have_side_effect?
|
914
996
|
end
|
915
997
|
|
998
|
+
def logical?
|
999
|
+
false
|
1000
|
+
end
|
1001
|
+
|
916
1002
|
def to_s
|
917
1003
|
"(#{@type_name.to_s}) #{@operand.to_s}"
|
918
1004
|
end
|
@@ -953,21 +1039,53 @@ module C #:nodoc:
|
|
953
1039
|
end
|
954
1040
|
end
|
955
1041
|
|
956
|
-
class MultiplicativeExpression < BinaryExpression
|
1042
|
+
class MultiplicativeExpression < BinaryExpression
|
1043
|
+
def logical?
|
1044
|
+
false
|
1045
|
+
end
|
1046
|
+
end
|
957
1047
|
|
958
|
-
class AdditiveExpression < BinaryExpression
|
1048
|
+
class AdditiveExpression < BinaryExpression
|
1049
|
+
def logical?
|
1050
|
+
false
|
1051
|
+
end
|
1052
|
+
end
|
959
1053
|
|
960
|
-
class ShiftExpression < BinaryExpression
|
1054
|
+
class ShiftExpression < BinaryExpression
|
1055
|
+
def logical?
|
1056
|
+
false
|
1057
|
+
end
|
1058
|
+
end
|
961
1059
|
|
962
|
-
class RelationalExpression < BinaryExpression
|
1060
|
+
class RelationalExpression < BinaryExpression
|
1061
|
+
def logical?
|
1062
|
+
true
|
1063
|
+
end
|
1064
|
+
end
|
963
1065
|
|
964
|
-
class EqualityExpression < BinaryExpression
|
1066
|
+
class EqualityExpression < BinaryExpression
|
1067
|
+
def logical?
|
1068
|
+
true
|
1069
|
+
end
|
1070
|
+
end
|
965
1071
|
|
966
|
-
class AndExpression < BinaryExpression
|
1072
|
+
class AndExpression < BinaryExpression
|
1073
|
+
def logical?
|
1074
|
+
false
|
1075
|
+
end
|
1076
|
+
end
|
967
1077
|
|
968
|
-
class ExclusiveOrExpression < BinaryExpression
|
1078
|
+
class ExclusiveOrExpression < BinaryExpression
|
1079
|
+
def logical?
|
1080
|
+
false
|
1081
|
+
end
|
1082
|
+
end
|
969
1083
|
|
970
|
-
class InclusiveOrExpression < BinaryExpression
|
1084
|
+
class InclusiveOrExpression < BinaryExpression
|
1085
|
+
def logical?
|
1086
|
+
false
|
1087
|
+
end
|
1088
|
+
end
|
971
1089
|
|
972
1090
|
class LogicalAndExpression < BinaryExpression
|
973
1091
|
def initialize(operator, lhs_operand, rhs_operand)
|
@@ -985,6 +1103,10 @@ module C #:nodoc:
|
|
985
1103
|
# to 0, the second operand is not evaluated.
|
986
1104
|
@lhs_operand.append_sequence_point!
|
987
1105
|
end
|
1106
|
+
|
1107
|
+
def logical?
|
1108
|
+
true
|
1109
|
+
end
|
988
1110
|
end
|
989
1111
|
|
990
1112
|
class LogicalOrExpression < BinaryExpression
|
@@ -1003,6 +1125,10 @@ module C #:nodoc:
|
|
1003
1125
|
# unequal to 0, the second operand is not evaluated.
|
1004
1126
|
@lhs_operand.append_sequence_point!
|
1005
1127
|
end
|
1128
|
+
|
1129
|
+
def logical?
|
1130
|
+
true
|
1131
|
+
end
|
1006
1132
|
end
|
1007
1133
|
|
1008
1134
|
class ConditionalExpression < Expression
|
@@ -1044,6 +1170,10 @@ module C #:nodoc:
|
|
1044
1170
|
@else_expression.have_side_effect?
|
1045
1171
|
end
|
1046
1172
|
|
1173
|
+
def logical?
|
1174
|
+
@then_expression.logical? || @else_expression.logical?
|
1175
|
+
end
|
1176
|
+
|
1047
1177
|
def to_s
|
1048
1178
|
"#{@condition.to_s} ? " +
|
1049
1179
|
"#{@then_expression.to_s} : #{@else_expression.to_s}"
|
@@ -1061,12 +1191,20 @@ module C #:nodoc:
|
|
1061
1191
|
def have_side_effect?
|
1062
1192
|
true
|
1063
1193
|
end
|
1194
|
+
|
1195
|
+
def logical?
|
1196
|
+
@rhs_operand.logical?
|
1197
|
+
end
|
1064
1198
|
end
|
1065
1199
|
|
1066
1200
|
class CompoundAssignmentExpression < BinaryExpression
|
1067
1201
|
def have_side_effect?
|
1068
1202
|
true
|
1069
1203
|
end
|
1204
|
+
|
1205
|
+
def logical?
|
1206
|
+
false
|
1207
|
+
end
|
1070
1208
|
end
|
1071
1209
|
|
1072
1210
|
class CommaSeparatedExpression < Expression
|
@@ -1086,6 +1224,10 @@ module C #:nodoc:
|
|
1086
1224
|
@expressions.any? { |expr| expr.have_side_effect? }
|
1087
1225
|
end
|
1088
1226
|
|
1227
|
+
def logical?
|
1228
|
+
@expressions.last.logical?
|
1229
|
+
end
|
1230
|
+
|
1089
1231
|
def to_s
|
1090
1232
|
@expressions.map { |expr| expr.to_s }.join(",")
|
1091
1233
|
end
|
@@ -1285,7 +1427,7 @@ module C #:nodoc:
|
|
1285
1427
|
end
|
1286
1428
|
|
1287
1429
|
def signature
|
1288
|
-
FunctionSignature.new(identifier, @type)
|
1430
|
+
FunctionSignature.new(identifier.value, @type)
|
1289
1431
|
end
|
1290
1432
|
|
1291
1433
|
def function_declarator
|
@@ -2804,7 +2946,7 @@ module C #:nodoc:
|
|
2804
2946
|
end
|
2805
2947
|
|
2806
2948
|
def signature
|
2807
|
-
FunctionSignature.new(identifier, @type)
|
2949
|
+
FunctionSignature.new(identifier.value, @type)
|
2808
2950
|
end
|
2809
2951
|
|
2810
2952
|
def function_declarator
|
@@ -3195,14 +3337,14 @@ module C #:nodoc:
|
|
3195
3337
|
|
3196
3338
|
def ==(rhs)
|
3197
3339
|
if @type.parameter_types.empty? || rhs.type.parameter_types.empty?
|
3198
|
-
@name
|
3340
|
+
@name == rhs.name
|
3199
3341
|
else
|
3200
|
-
@name
|
3342
|
+
@name == rhs.name && @type == rhs.type
|
3201
3343
|
end
|
3202
3344
|
end
|
3203
3345
|
|
3204
3346
|
def to_s
|
3205
|
-
"#{@type.return_type.brief_image} #{@name
|
3347
|
+
"#{@type.return_type.brief_image} #{@name}(" +
|
3206
3348
|
@type.parameter_types.map { |t| t.brief_image }.join(",") +
|
3207
3349
|
(@type.have_va_list? ? ",...)" : ")")
|
3208
3350
|
end
|
@@ -4294,6 +4436,22 @@ module C #:nodoc:
|
|
4294
4436
|
end
|
4295
4437
|
end
|
4296
4438
|
|
4439
|
+
class TypedefTypeSpecifierCollector < SyntaxTreeVisitor
|
4440
|
+
def initialize
|
4441
|
+
@typedef_type_specifiers = []
|
4442
|
+
end
|
4443
|
+
|
4444
|
+
attr_reader :typedef_type_specifiers
|
4445
|
+
|
4446
|
+
def visit_variable_definition(node)
|
4447
|
+
end
|
4448
|
+
|
4449
|
+
def visit_typedef_type_specifier(node)
|
4450
|
+
super
|
4451
|
+
@typedef_type_specifiers.push(node)
|
4452
|
+
end
|
4453
|
+
end
|
4454
|
+
|
4297
4455
|
class FunctionDeclaratorCollector < SyntaxTreeVisitor
|
4298
4456
|
def initialize
|
4299
4457
|
@function_declarators = []
|