adlint 3.0.4 → 3.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +374 -13
- data/INSTALL +1 -3
- data/MANIFEST +12 -0
- data/NEWS +30 -4
- data/README +0 -4
- data/TODO +2 -1
- data/etc/mesg.d/c_builtin/en_US/messages.yml +2 -2
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +2 -2
- data/etc/mesg.d/core/en_US/messages.yml +5 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +5 -1
- data/features/code_check/W0422.feature +128 -0
- data/features/code_check/W0491.feature +57 -0
- data/features/code_check/W0492.feature +80 -0
- data/features/code_check/W0542.feature +20 -0
- data/features/code_check/W0580.feature +25 -0
- data/features/code_check/W0610.feature +36 -0
- data/features/code_check/W0642.feature +67 -0
- data/features/code_check/W0786.feature +39 -0
- data/features/code_check/W0830.feature +27 -0
- data/features/code_check/W1047.feature +72 -0
- data/features/code_check/W9003.feature +22 -0
- data/features/code_extraction/TODO +1 -0
- data/features/metric_measurement/TODO +1 -0
- data/lib/adlint/analyzer.rb +2 -2
- data/lib/adlint/cc1/ctrlexpr.rb +27 -6
- data/lib/adlint/cc1/domain.rb +72 -12
- data/lib/adlint/cc1/enum.rb +4 -0
- data/lib/adlint/cc1/expr.rb +31 -29
- data/lib/adlint/cc1/interp.rb +45 -56
- data/lib/adlint/cc1/lexer.rb +26 -5
- data/lib/adlint/cc1/mediator.rb +35 -6
- data/lib/adlint/cc1/object.rb +62 -19
- data/lib/adlint/cc1/parser.rb +948 -904
- data/lib/adlint/cc1/parser.y +59 -29
- data/lib/adlint/cc1/phase.rb +6 -8
- data/lib/adlint/cc1/syntax.rb +70 -17
- data/lib/adlint/cc1/util.rb +4 -4
- data/lib/adlint/code.rb +16 -6
- data/lib/adlint/cpp/eval.rb +31 -25
- data/lib/adlint/cpp/lexer.rb +11 -5
- data/lib/adlint/cpp/macro.rb +34 -7
- data/lib/adlint/cpp/phase.rb +8 -8
- data/lib/adlint/error.rb +6 -0
- data/lib/adlint/exam/c_builtin/cc1_check.rb +557 -594
- data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +72 -72
- data/lib/adlint/exam/c_builtin/cc1_code.rb +72 -52
- data/lib/adlint/exam/c_builtin/cc1_metric.rb +131 -131
- data/lib/adlint/exam/c_builtin/cpp_check.rb +48 -48
- data/lib/adlint/exam/c_builtin/cpp_check_shima.rb +2 -2
- data/lib/adlint/exam/c_builtin/cpp_code.rb +21 -21
- data/lib/adlint/exam/c_builtin/ld_check.rb +88 -87
- data/lib/adlint/exam/c_builtin/ld_metric.rb +4 -5
- data/lib/adlint/exam/c_builtin.rb +6 -6
- data/lib/adlint/ld/object.rb +269 -186
- data/lib/adlint/ld/phase.rb +19 -19
- data/lib/adlint/ld/typedef.rb +7 -7
- data/lib/adlint/ld/util.rb +25 -17
- data/lib/adlint/location.rb +6 -1
- data/lib/adlint/memo.rb +66 -13
- data/lib/adlint/prelude.rb +2 -2
- data/lib/adlint/report.rb +13 -14
- data/lib/adlint/util.rb +1 -1
- data/lib/adlint/version.rb +2 -2
- data/share/doc/Makefile +6 -2
- data/share/doc/c99gram.dot +502 -0
- data/share/doc/c99gram.pdf +0 -0
- data/share/doc/developers_guide_ja.html +4 -3
- data/share/doc/developers_guide_ja.texi +2 -1
- data/share/doc/users_guide_en.html +9 -9
- data/share/doc/users_guide_en.texi +7 -7
- data/share/doc/users_guide_ja.html +9 -9
- data/share/doc/users_guide_ja.texi +7 -7
- metadata +14 -2
data/lib/adlint/cc1/parser.y
CHANGED
@@ -547,7 +547,7 @@ declaration
|
|
547
547
|
: declaration_specifiers ";"
|
548
548
|
{
|
549
549
|
checkpoint(val[0].location)
|
550
|
-
@lexer.
|
550
|
+
@lexer.enable_identifier_translation
|
551
551
|
result = Declaration.new(val[0], [], @sym_tbl)
|
552
552
|
result.head_token = val[0].head_token
|
553
553
|
result.tail_token = val[1]
|
@@ -555,6 +555,7 @@ declaration
|
|
555
555
|
| declaration_specifiers init_declarator_list ";"
|
556
556
|
{
|
557
557
|
checkpoint(val[0].location)
|
558
|
+
@lexer.enable_identifier_translation
|
558
559
|
result = Declaration.new(val[0], val[1], @sym_tbl)
|
559
560
|
result.head_token = val[0].head_token
|
560
561
|
result.tail_token = val[2]
|
@@ -598,7 +599,6 @@ declaration_specifiers
|
|
598
599
|
| type_specifier
|
599
600
|
{
|
600
601
|
checkpoint(val[0].location)
|
601
|
-
@lexer.stop_identifier_translation
|
602
602
|
result = DeclarationSpecifiers.new
|
603
603
|
result.type_specifiers.push(val[0])
|
604
604
|
result.head_token = val[0].head_token
|
@@ -607,7 +607,6 @@ declaration_specifiers
|
|
607
607
|
| declaration_specifiers type_specifier
|
608
608
|
{
|
609
609
|
checkpoint(val[0].location)
|
610
|
-
@lexer.stop_identifier_translation
|
611
610
|
result = val[0]
|
612
611
|
result.type_specifiers.push(val[1])
|
613
612
|
result.tail_token = val[1].tail_token
|
@@ -684,86 +683,110 @@ type_specifier
|
|
684
683
|
: VOID
|
685
684
|
{
|
686
685
|
checkpoint(val[0].location)
|
686
|
+
@lexer.disable_identifier_translation
|
687
687
|
result = StandardTypeSpecifier.new(val[0])
|
688
688
|
result.head_token = result.tail_token = val[0]
|
689
689
|
}
|
690
690
|
| CHAR
|
691
691
|
{
|
692
692
|
checkpoint(val[0].location)
|
693
|
+
@lexer.disable_identifier_translation
|
693
694
|
result = StandardTypeSpecifier.new(val[0])
|
694
695
|
result.head_token = result.tail_token = val[0]
|
695
696
|
}
|
696
697
|
| SHORT
|
697
698
|
{
|
698
699
|
checkpoint(val[0].location)
|
700
|
+
@lexer.disable_identifier_translation
|
699
701
|
result = StandardTypeSpecifier.new(val[0])
|
700
702
|
result.head_token = result.tail_token = val[0]
|
701
703
|
}
|
702
704
|
| INT
|
703
705
|
{
|
704
706
|
checkpoint(val[0].location)
|
707
|
+
@lexer.disable_identifier_translation
|
705
708
|
result = StandardTypeSpecifier.new(val[0])
|
706
709
|
result.head_token = result.tail_token = val[0]
|
707
710
|
}
|
708
711
|
| LONG
|
709
712
|
{
|
710
713
|
checkpoint(val[0].location)
|
714
|
+
@lexer.disable_identifier_translation
|
711
715
|
result = StandardTypeSpecifier.new(val[0])
|
712
716
|
result.head_token = result.tail_token = val[0]
|
713
717
|
}
|
714
718
|
| FLOAT
|
715
719
|
{
|
716
720
|
checkpoint(val[0].location)
|
721
|
+
@lexer.disable_identifier_translation
|
717
722
|
result = StandardTypeSpecifier.new(val[0])
|
718
723
|
result.head_token = result.tail_token = val[0]
|
719
724
|
}
|
720
725
|
| DOUBLE
|
721
726
|
{
|
722
727
|
checkpoint(val[0].location)
|
728
|
+
@lexer.disable_identifier_translation
|
723
729
|
result = StandardTypeSpecifier.new(val[0])
|
724
730
|
result.head_token = result.tail_token = val[0]
|
725
731
|
}
|
726
732
|
| SIGNED
|
727
733
|
{
|
728
734
|
checkpoint(val[0].location)
|
735
|
+
@lexer.disable_identifier_translation
|
729
736
|
result = StandardTypeSpecifier.new(val[0])
|
730
737
|
result.head_token = result.tail_token = val[0]
|
731
738
|
}
|
732
739
|
| UNSIGNED
|
733
740
|
{
|
734
741
|
checkpoint(val[0].location)
|
742
|
+
@lexer.disable_identifier_translation
|
735
743
|
result = StandardTypeSpecifier.new(val[0])
|
736
744
|
result.head_token = result.tail_token = val[0]
|
737
745
|
}
|
738
746
|
| BOOL
|
739
747
|
{
|
740
748
|
checkpoint(val[0].location)
|
749
|
+
@lexer.disable_identifier_translation
|
741
750
|
result = StandardTypeSpecifier.new(val[0])
|
742
751
|
result.head_token = result.tail_token = val[0]
|
743
752
|
}
|
744
753
|
| COMPLEX
|
745
754
|
{
|
746
755
|
checkpoint(val[0].location)
|
756
|
+
@lexer.disable_identifier_translation
|
747
757
|
result = StandardTypeSpecifier.new(val[0])
|
748
758
|
result.head_token = result.tail_token = val[0]
|
749
759
|
}
|
750
760
|
| IMAGINARY
|
751
761
|
{
|
752
762
|
checkpoint(val[0].location)
|
763
|
+
@lexer.disable_identifier_translation
|
753
764
|
result = StandardTypeSpecifier.new(val[0])
|
754
765
|
result.head_token = result.tail_token = val[0]
|
755
766
|
}
|
756
767
|
| TYPEDEF_NAME
|
757
768
|
{
|
758
769
|
checkpoint(val[0].location)
|
770
|
+
@lexer.disable_identifier_translation
|
759
771
|
result = TypedefTypeSpecifier.new(val[0])
|
760
772
|
result.head_token = result.tail_token = val[0]
|
761
773
|
}
|
762
774
|
| struct_or_union_specifier
|
775
|
+
{
|
776
|
+
checkpoint(val[0].location)
|
777
|
+
@lexer.disable_identifier_translation
|
778
|
+
result = val[0]
|
779
|
+
}
|
763
780
|
| enum_specifier
|
781
|
+
{
|
782
|
+
checkpoint(val[0].location)
|
783
|
+
@lexer.disable_identifier_translation
|
784
|
+
result = val[0]
|
785
|
+
}
|
764
786
|
| TYPEOF "(" constant_expression ")"
|
765
787
|
{
|
766
788
|
checkpoint(val[0].location)
|
789
|
+
@lexer.disable_identifier_translation
|
767
790
|
val[2].full = true
|
768
791
|
result = TypeofTypeSpecifier.new(val[2], nil)
|
769
792
|
result.head_token = val[0]
|
@@ -772,6 +795,7 @@ type_specifier
|
|
772
795
|
| TYPEOF "(" type_name ")"
|
773
796
|
{
|
774
797
|
checkpoint(val[0].location)
|
798
|
+
@lexer.disable_identifier_translation
|
775
799
|
result = TypeofTypeSpecifier.new(nil, val[2])
|
776
800
|
result.head_token = val[0]
|
777
801
|
result.tail_token = val[3]
|
@@ -855,11 +879,13 @@ struct_declaration_list
|
|
855
879
|
: struct_declaration
|
856
880
|
{
|
857
881
|
checkpoint(val[0].location)
|
882
|
+
@lexer.enable_identifier_translation
|
858
883
|
result = val
|
859
884
|
}
|
860
885
|
| struct_declaration_list struct_declaration
|
861
886
|
{
|
862
887
|
checkpoint(val[0].first.location)
|
888
|
+
@lexer.enable_identifier_translation
|
863
889
|
result = val[0].push(val[1])
|
864
890
|
}
|
865
891
|
;
|
@@ -868,18 +894,16 @@ struct_declaration
|
|
868
894
|
: specifier_qualifier_list ";"
|
869
895
|
{
|
870
896
|
checkpoint(val[0].location)
|
871
|
-
@lexer.start_identifier_translation
|
872
897
|
result = StructDeclaration.new(val[0], [])
|
873
898
|
result.head_token = val[0].head_token
|
874
899
|
result.tail_token = val[1]
|
875
900
|
}
|
876
|
-
| specifier_qualifier_list
|
877
|
-
struct_declarator_list ";"
|
901
|
+
| specifier_qualifier_list struct_declarator_list ";"
|
878
902
|
{
|
879
903
|
checkpoint(val[0].location)
|
880
|
-
result = StructDeclaration.new(val[0], val[
|
904
|
+
result = StructDeclaration.new(val[0], val[1])
|
881
905
|
result.head_token = val[0].head_token
|
882
|
-
result.tail_token = val[
|
906
|
+
result.tail_token = val[2]
|
883
907
|
}
|
884
908
|
;
|
885
909
|
|
@@ -887,7 +911,6 @@ specifier_qualifier_list
|
|
887
911
|
: specifier_qualifier_list type_specifier
|
888
912
|
{
|
889
913
|
checkpoint(val[0].location)
|
890
|
-
@lexer.stop_identifier_translation
|
891
914
|
result = val[0]
|
892
915
|
result.type_specifiers.push(val[1])
|
893
916
|
result.tail_token = val[1].tail_token
|
@@ -895,7 +918,6 @@ specifier_qualifier_list
|
|
895
918
|
| type_specifier
|
896
919
|
{
|
897
920
|
checkpoint(val[0].location)
|
898
|
-
@lexer.stop_identifier_translation
|
899
921
|
result = SpecifierQualifierList.new
|
900
922
|
result.type_specifiers.push(val[0])
|
901
923
|
result.head_token = val[0].head_token
|
@@ -1058,7 +1080,7 @@ direct_declarator
|
|
1058
1080
|
: IDENTIFIER
|
1059
1081
|
{
|
1060
1082
|
checkpoint(val[0].location)
|
1061
|
-
@lexer.
|
1083
|
+
@lexer.enable_identifier_translation
|
1062
1084
|
result = IdentifierDeclarator.new(val[0])
|
1063
1085
|
result.head_token = result.tail_token = val[0]
|
1064
1086
|
}
|
@@ -1131,12 +1153,13 @@ direct_declarator
|
|
1131
1153
|
result.head_token = val[0].head_token
|
1132
1154
|
result.tail_token = val[2]
|
1133
1155
|
}
|
1134
|
-
| direct_declarator "("
|
1156
|
+
| direct_declarator "(" { @lexer.enable_identifier_translation }
|
1157
|
+
parameter_type_list ")"
|
1135
1158
|
{
|
1136
1159
|
checkpoint(val[0].location)
|
1137
|
-
result = AnsiFunctionDeclarator.new(val[0], val[
|
1160
|
+
result = AnsiFunctionDeclarator.new(val[0], val[3])
|
1138
1161
|
result.head_token = val[0].head_token
|
1139
|
-
result.tail_token = val[
|
1162
|
+
result.tail_token = val[4]
|
1140
1163
|
}
|
1141
1164
|
| direct_declarator "(" identifier_list ")"
|
1142
1165
|
{
|
@@ -1224,6 +1247,7 @@ parameter_declaration
|
|
1224
1247
|
: declaration_specifiers declarator
|
1225
1248
|
{
|
1226
1249
|
checkpoint(val[0].location)
|
1250
|
+
@lexer.enable_identifier_translation
|
1227
1251
|
result = ParameterDeclaration.new(val[0], val[1])
|
1228
1252
|
result.head_token = val[0].head_token
|
1229
1253
|
result.tail_token = val[1].tail_token
|
@@ -1231,6 +1255,7 @@ parameter_declaration
|
|
1231
1255
|
| declaration_specifiers abstract_declarator
|
1232
1256
|
{
|
1233
1257
|
checkpoint(val[0].location)
|
1258
|
+
@lexer.enable_identifier_translation
|
1234
1259
|
result = ParameterDeclaration.new(val[0], val[1])
|
1235
1260
|
result.head_token = val[0].head_token
|
1236
1261
|
result.tail_token = val[1].tail_token
|
@@ -1238,7 +1263,7 @@ parameter_declaration
|
|
1238
1263
|
| declaration_specifiers
|
1239
1264
|
{
|
1240
1265
|
checkpoint(val[0].location)
|
1241
|
-
@lexer.
|
1266
|
+
@lexer.enable_identifier_translation
|
1242
1267
|
result = ParameterDeclaration.new(val[0], nil)
|
1243
1268
|
result.head_token = val[0].head_token
|
1244
1269
|
result.tail_token = val[0].tail_token
|
@@ -1262,7 +1287,7 @@ type_name
|
|
1262
1287
|
: specifier_qualifier_list
|
1263
1288
|
{
|
1264
1289
|
checkpoint(val[0].location)
|
1265
|
-
@lexer.
|
1290
|
+
@lexer.enable_identifier_translation
|
1266
1291
|
result = TypeName.new(val[0], nil, @sym_tbl)
|
1267
1292
|
result.head_token = val[0].head_token
|
1268
1293
|
result.tail_token = val[0].tail_token
|
@@ -1270,6 +1295,7 @@ type_name
|
|
1270
1295
|
| specifier_qualifier_list abstract_declarator
|
1271
1296
|
{
|
1272
1297
|
checkpoint(val[0].location)
|
1298
|
+
@lexer.enable_identifier_translation
|
1273
1299
|
result = TypeName.new(val[0], val[1], @sym_tbl)
|
1274
1300
|
result.head_token = val[0].head_token
|
1275
1301
|
result.tail_token = val[1].tail_token
|
@@ -1280,7 +1306,7 @@ abstract_declarator
|
|
1280
1306
|
: pointer
|
1281
1307
|
{
|
1282
1308
|
checkpoint(val[0].first.location)
|
1283
|
-
@lexer.
|
1309
|
+
@lexer.enable_identifier_translation
|
1284
1310
|
result = PointerAbstractDeclarator.new(nil, val[0])
|
1285
1311
|
result.head_token = val[0].first
|
1286
1312
|
result.tail_token = val[0].last
|
@@ -1289,6 +1315,7 @@ abstract_declarator
|
|
1289
1315
|
| pointer direct_abstract_declarator
|
1290
1316
|
{
|
1291
1317
|
checkpoint(val[0].first.location)
|
1318
|
+
@lexer.enable_identifier_translation
|
1292
1319
|
result = PointerAbstractDeclarator.new(val[1], val[0])
|
1293
1320
|
result.head_token = val[0].first
|
1294
1321
|
result.tail_token = val[1].tail_token
|
@@ -1306,7 +1333,6 @@ direct_abstract_declarator
|
|
1306
1333
|
: "(" abstract_declarator ")"
|
1307
1334
|
{
|
1308
1335
|
checkpoint(val[0].location)
|
1309
|
-
@lexer.start_identifier_translation
|
1310
1336
|
result = GroupedAbstractDeclarator.new(val[1])
|
1311
1337
|
result.head_token = val[0]
|
1312
1338
|
result.tail_token = val[2]
|
@@ -1314,7 +1340,6 @@ direct_abstract_declarator
|
|
1314
1340
|
| "[" "]"
|
1315
1341
|
{
|
1316
1342
|
checkpoint(val[0].location)
|
1317
|
-
@lexer.start_identifier_translation
|
1318
1343
|
result = ArrayAbstractDeclarator.new(nil, nil)
|
1319
1344
|
result.head_token = val[0]
|
1320
1345
|
result.tail_token = val[1]
|
@@ -1322,7 +1347,6 @@ direct_abstract_declarator
|
|
1322
1347
|
| "[" assignment_expression "]"
|
1323
1348
|
{
|
1324
1349
|
checkpoint(val[0].location)
|
1325
|
-
@lexer.start_identifier_translation
|
1326
1350
|
val[1].full = true
|
1327
1351
|
result = ArrayAbstractDeclarator.new(nil, val[1])
|
1328
1352
|
result.head_token = val[0]
|
@@ -1346,7 +1370,6 @@ direct_abstract_declarator
|
|
1346
1370
|
| "[" "*" "]"
|
1347
1371
|
{
|
1348
1372
|
checkpoint(val[0].location)
|
1349
|
-
@lexer.start_identifier_translation
|
1350
1373
|
result = ArrayAbstractDeclarator.new(nil, nil)
|
1351
1374
|
result.head_token = val[0]
|
1352
1375
|
result.tail_token = val[2]
|
@@ -1361,12 +1384,11 @@ direct_abstract_declarator
|
|
1361
1384
|
| "(" ")"
|
1362
1385
|
{
|
1363
1386
|
checkpoint(val[0].location)
|
1364
|
-
@lexer.start_identifier_translation
|
1365
1387
|
result = FunctionAbstractDeclarator.new(nil, nil)
|
1366
1388
|
result.head_token = val[0]
|
1367
1389
|
result.tail_token = val[1]
|
1368
1390
|
}
|
1369
|
-
| "(" { @lexer.
|
1391
|
+
| "(" { @lexer.enable_identifier_translation } parameter_type_list ")"
|
1370
1392
|
{
|
1371
1393
|
checkpoint(val[0].location)
|
1372
1394
|
result = FunctionAbstractDeclarator.new(nil, val[2])
|
@@ -1376,17 +1398,17 @@ direct_abstract_declarator
|
|
1376
1398
|
| direct_abstract_declarator "(" ")"
|
1377
1399
|
{
|
1378
1400
|
checkpoint(val[0].location)
|
1379
|
-
@lexer.start_identifier_translation
|
1380
1401
|
result = FunctionAbstractDeclarator.new(val[0], nil)
|
1381
1402
|
result.head_token = val[0].head_token
|
1382
1403
|
result.tail_token = val[2]
|
1383
1404
|
}
|
1384
|
-
| direct_abstract_declarator "("
|
1405
|
+
| direct_abstract_declarator "(" { @lexer.enable_identifier_translation }
|
1406
|
+
parameter_type_list ")"
|
1385
1407
|
{
|
1386
1408
|
checkpoint(val[0].location)
|
1387
|
-
result = FunctionAbstractDeclarator.new(val[0], val[
|
1409
|
+
result = FunctionAbstractDeclarator.new(val[0], val[3])
|
1388
1410
|
result.head_token = val[0].head_token
|
1389
|
-
result.tail_token = val[
|
1411
|
+
result.tail_token = val[4]
|
1390
1412
|
}
|
1391
1413
|
;
|
1392
1414
|
|
@@ -1472,7 +1494,7 @@ statement
|
|
1472
1494
|
;
|
1473
1495
|
|
1474
1496
|
labeled_statement
|
1475
|
-
:
|
1497
|
+
: label_name ":" statement
|
1476
1498
|
{
|
1477
1499
|
checkpoint(val[0].location)
|
1478
1500
|
result = GenericLabeledStatement.new(val[0], val[2])
|
@@ -1496,6 +1518,14 @@ labeled_statement
|
|
1496
1518
|
}
|
1497
1519
|
;
|
1498
1520
|
|
1521
|
+
label_name
|
1522
|
+
: IDENTIFIER
|
1523
|
+
| TYPEDEF_NAME
|
1524
|
+
{
|
1525
|
+
result = val[0].class.new(:IDENTIFIER, val[0].value, val[0].location)
|
1526
|
+
}
|
1527
|
+
;
|
1528
|
+
|
1499
1529
|
compound_statement
|
1500
1530
|
: "{" "}"
|
1501
1531
|
{
|
@@ -1627,7 +1657,7 @@ iteration_statement
|
|
1627
1657
|
;
|
1628
1658
|
|
1629
1659
|
jump_statement
|
1630
|
-
: GOTO
|
1660
|
+
: GOTO label_name ";"
|
1631
1661
|
{
|
1632
1662
|
checkpoint(val[0].location)
|
1633
1663
|
result = GotoStatement.new(val[1])
|
data/lib/adlint/cc1/phase.rb
CHANGED
@@ -53,7 +53,7 @@ module Cc1 #:nodoc:
|
|
53
53
|
|
54
54
|
private
|
55
55
|
def do_execute(phase_ctxt, *)
|
56
|
-
phase_ctxt[:
|
56
|
+
phase_ctxt[:cc1_ast_traversal] = SyntaxTreeMulticastVisitor.new
|
57
57
|
phase_ctxt[:cc1_parser] = Parser.new(phase_ctxt)
|
58
58
|
end
|
59
59
|
end
|
@@ -65,9 +65,9 @@ module Cc1 #:nodoc:
|
|
65
65
|
|
66
66
|
private
|
67
67
|
def do_execute(phase_ctxt, *)
|
68
|
-
phase_ctxt[:
|
68
|
+
phase_ctxt[:cc1_ast] = phase_ctxt[:cc1_parser].execute
|
69
69
|
ensure
|
70
|
-
phase_ctxt[:
|
70
|
+
phase_ctxt[:cc1_tokens] = phase_ctxt[:cc1_parser].token_array
|
71
71
|
DebugUtil.dump_token_array(phase_ctxt)
|
72
72
|
end
|
73
73
|
end
|
@@ -80,8 +80,7 @@ module Cc1 #:nodoc:
|
|
80
80
|
private
|
81
81
|
def do_execute(phase_ctxt, *)
|
82
82
|
resolver = StaticTypeResolver.new(TypeTable.new(traits, monitor, logger))
|
83
|
-
phase_ctxt[:cc1_type_table] =
|
84
|
-
resolver.resolve(phase_ctxt[:cc1_syntax_tree])
|
83
|
+
phase_ctxt[:cc1_type_table] = resolver.resolve(phase_ctxt[:cc1_ast])
|
85
84
|
end
|
86
85
|
end
|
87
86
|
|
@@ -104,8 +103,7 @@ module Cc1 #:nodoc:
|
|
104
103
|
|
105
104
|
private
|
106
105
|
def do_execute(phase_ctxt, *)
|
107
|
-
Program.new(phase_ctxt[:cc1_interpreter],
|
108
|
-
phase_ctxt[:cc1_syntax_tree]).execute
|
106
|
+
Program.new(phase_ctxt[:cc1_interpreter], phase_ctxt[:cc1_ast]).execute
|
109
107
|
ValueDomain.clear_memos
|
110
108
|
ensure
|
111
109
|
DebugUtil.dump_syntax_tree(phase_ctxt)
|
@@ -119,7 +117,7 @@ module Cc1 #:nodoc:
|
|
119
117
|
|
120
118
|
private
|
121
119
|
def do_execute(phase_ctxt, *)
|
122
|
-
phase_ctxt[:
|
120
|
+
phase_ctxt[:cc1_ast].accept(phase_ctxt[:cc1_ast_traversal])
|
123
121
|
end
|
124
122
|
end
|
125
123
|
|
data/lib/adlint/cc1/syntax.rb
CHANGED
@@ -439,6 +439,19 @@ module Cc1 #:nodoc:
|
|
439
439
|
module_function :collect_constant_specifiers
|
440
440
|
end
|
441
441
|
|
442
|
+
module InterpSyntaxBridge
|
443
|
+
# NOTE: InterpreterMediator includes this module to bridge constant
|
444
|
+
# designator collector to this layer.
|
445
|
+
|
446
|
+
def _interp_syntax_bridge_
|
447
|
+
{
|
448
|
+
enumerator_designators: method(:enumerator_designators),
|
449
|
+
function_designators: method(:function_designators),
|
450
|
+
variable_designators: method(:variable_designators)
|
451
|
+
}
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
442
455
|
class Expression < SyntaxNode
|
443
456
|
def initialize
|
444
457
|
super
|
@@ -470,8 +483,8 @@ module Cc1 #:nodoc:
|
|
470
483
|
subclass_responsibility
|
471
484
|
end
|
472
485
|
|
473
|
-
def constant?(
|
474
|
-
|
486
|
+
def constant?(interp_bridge)
|
487
|
+
ExpressionConstancy.new(interp_bridge).check(self)
|
475
488
|
end
|
476
489
|
|
477
490
|
def logical?
|
@@ -2321,9 +2334,9 @@ module Cc1 #:nodoc:
|
|
2321
2334
|
type_dcls = []
|
2322
2335
|
|
2323
2336
|
dcl_specs.type_specifiers.each do |type_spec|
|
2324
|
-
|
2325
|
-
type_spec.accept(
|
2326
|
-
type_dcls.concat(
|
2337
|
+
builder = TypeDeclarationBuilder.new(sym_tbl)
|
2338
|
+
type_spec.accept(builder)
|
2339
|
+
type_dcls.concat(builder.type_declarations)
|
2327
2340
|
end
|
2328
2341
|
|
2329
2342
|
if sc = dcl_specs.storage_class_specifier and sc.type == :TYPEDEF
|
@@ -3991,10 +4004,10 @@ module Cc1 #:nodoc:
|
|
3991
4004
|
def build_type_declaration(dcl_specs, sym_tbl)
|
3992
4005
|
return nil unless dcl_specs
|
3993
4006
|
dcl_specs.type_specifiers.each do |type_spec|
|
3994
|
-
|
3995
|
-
type_spec.accept(
|
3996
|
-
unless
|
3997
|
-
return
|
4007
|
+
builder = TypeDeclarationBuilder.new(sym_tbl)
|
4008
|
+
type_spec.accept(builder)
|
4009
|
+
unless builder.type_declarations.empty?
|
4010
|
+
return builder.type_declarations.first
|
3998
4011
|
end
|
3999
4012
|
end
|
4000
4013
|
nil
|
@@ -4191,10 +4204,10 @@ module Cc1 #:nodoc:
|
|
4191
4204
|
private
|
4192
4205
|
def build_type_declaration(spec_qual_list, sym_tbl)
|
4193
4206
|
spec_qual_list.type_specifiers.each do |type_spec|
|
4194
|
-
|
4195
|
-
type_spec.accept(
|
4196
|
-
unless
|
4197
|
-
return
|
4207
|
+
builder = TypeDeclarationBuilder.new(sym_tbl)
|
4208
|
+
type_spec.accept(builder)
|
4209
|
+
unless builder.type_declarations.empty?
|
4210
|
+
return builder.type_declarations.first
|
4198
4211
|
end
|
4199
4212
|
end
|
4200
4213
|
nil
|
@@ -5470,10 +5483,16 @@ module Cc1 #:nodoc:
|
|
5470
5483
|
|
5471
5484
|
attr_reader :expressions
|
5472
5485
|
|
5473
|
-
def push_expression(
|
5474
|
-
@expressions.push(
|
5486
|
+
def push_expression(expr)
|
5487
|
+
@expressions.push(expr)
|
5475
5488
|
end
|
5489
|
+
private :push_expression
|
5476
5490
|
|
5491
|
+
alias :visit_error_expression :push_expression
|
5492
|
+
alias :visit_object_specifier :push_expression
|
5493
|
+
alias :visit_constant_specifier :push_expression
|
5494
|
+
alias :visit_string_literal_specifier :push_expression
|
5495
|
+
alias :visit_null_constant_specifier :push_expression
|
5477
5496
|
alias :visit_grouped_expression :push_expression
|
5478
5497
|
alias :visit_array_subscript_expression :push_expression
|
5479
5498
|
alias :visit_function_call_expression :push_expression
|
@@ -5490,7 +5509,9 @@ module Cc1 #:nodoc:
|
|
5490
5509
|
alias :visit_indirection_expression :push_expression
|
5491
5510
|
alias :visit_unary_arithmetic_expression :push_expression
|
5492
5511
|
alias :visit_sizeof_expression :push_expression
|
5512
|
+
alias :visit_sizeof_type_expression :push_expression
|
5493
5513
|
alias :visit_alignof_expression :push_expression
|
5514
|
+
alias :visit_alignof_type_expression :push_expression
|
5494
5515
|
alias :visit_cast_expression :push_expression
|
5495
5516
|
alias :visit_multiplicative_expression :push_expression
|
5496
5517
|
alias :visit_additive_expression :push_expression
|
@@ -5505,8 +5526,6 @@ module Cc1 #:nodoc:
|
|
5505
5526
|
alias :visit_conditional_expression :push_expression
|
5506
5527
|
alias :visit_simple_assignment_expression :push_expression
|
5507
5528
|
alias :visit_compound_assignment_expression :push_expression
|
5508
|
-
|
5509
|
-
private :push_expression
|
5510
5529
|
end
|
5511
5530
|
|
5512
5531
|
class ConditionalExpressionExtractor < SyntaxTreeVisitor
|
@@ -5521,5 +5540,39 @@ module Cc1 #:nodoc:
|
|
5521
5540
|
end
|
5522
5541
|
end
|
5523
5542
|
|
5543
|
+
class ExpressionConstancy < SyntaxTreeVisitor
|
5544
|
+
def initialize(interp_bridge)
|
5545
|
+
@interp_bridge = interp_bridge
|
5546
|
+
end
|
5547
|
+
|
5548
|
+
def check(expr)
|
5549
|
+
catch(:constancy) { expr.accept(self); true }
|
5550
|
+
end
|
5551
|
+
|
5552
|
+
def visit_object_specifier(node)
|
5553
|
+
var_designators = @interp_bridge[:variable_designators][]
|
5554
|
+
if var_designators.include?(node.identifier.value)
|
5555
|
+
break_as_inconstant
|
5556
|
+
end
|
5557
|
+
end
|
5558
|
+
|
5559
|
+
def visit_address_expression(node)
|
5560
|
+
# NOTE: To treat address of variables as an address-constant.
|
5561
|
+
end
|
5562
|
+
|
5563
|
+
def break_as_inconstant(*)
|
5564
|
+
throw(:constancy, false)
|
5565
|
+
end
|
5566
|
+
private :break_as_inconstant
|
5567
|
+
|
5568
|
+
alias :visit_function_call_expression :break_as_inconstant
|
5569
|
+
alias :visit_postfix_increment_expression :break_as_inconstant
|
5570
|
+
alias :visit_postfix_decrement_expression :break_as_inconstant
|
5571
|
+
alias :visit_prefix_increment_expression :break_as_inconstant
|
5572
|
+
alias :visit_prefix_decrement_expression :break_as_inconstant
|
5573
|
+
alias :visit_simple_assignment_expression :break_as_inconstant
|
5574
|
+
alias :visit_compound_assignment_expression :break_as_inconstant
|
5575
|
+
end
|
5576
|
+
|
5524
5577
|
end
|
5525
5578
|
end
|
data/lib/adlint/cc1/util.rb
CHANGED
@@ -72,8 +72,8 @@ module Cc1 #:nodoc:
|
|
72
72
|
ast_fpath = ast_fname.expand_path(phase_ctxt.msg_fpath.dirname)
|
73
73
|
|
74
74
|
File.open(ast_fpath, "w") do |io|
|
75
|
-
if phase_ctxt[:
|
76
|
-
PP.pp(phase_ctxt[:
|
75
|
+
if phase_ctxt[:cc1_ast]
|
76
|
+
PP.pp(phase_ctxt[:cc1_ast], io)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -86,8 +86,8 @@ module Cc1 #:nodoc:
|
|
86
86
|
tok_fpath = tok_fname.expand_path(phase_ctxt.msg_fpath.dirname)
|
87
87
|
|
88
88
|
File.open(tok_fpath, "w") do |io|
|
89
|
-
if phase_ctxt[:
|
90
|
-
phase_ctxt[:
|
89
|
+
if phase_ctxt[:cc1_tokens]
|
90
|
+
phase_ctxt[:cc1_tokens].each { |tok| io.puts(tok.inspect) }
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
data/lib/adlint/code.rb
CHANGED
@@ -123,7 +123,7 @@ module AdLint #:nodoc:
|
|
123
123
|
|
124
124
|
# == DESCRIPTION
|
125
125
|
# Function declaration information.
|
126
|
-
class
|
126
|
+
class FunDcl < CodeStructure
|
127
127
|
# === DESCRIPTION
|
128
128
|
# Constructs the function declaration information.
|
129
129
|
#
|
@@ -188,7 +188,7 @@ module AdLint #:nodoc:
|
|
188
188
|
|
189
189
|
# == DESCRIPTION
|
190
190
|
# Function definition information.
|
191
|
-
class
|
191
|
+
class FunDef < CodeStructure
|
192
192
|
# === DESCRIPTION
|
193
193
|
# Constructs the function definition information.
|
194
194
|
#
|
@@ -350,7 +350,7 @@ module AdLint #:nodoc:
|
|
350
350
|
|
351
351
|
# == DESCRIPTION
|
352
352
|
# Function call information.
|
353
|
-
class
|
353
|
+
class Funcall < CodeStructure
|
354
354
|
# === DESCRIPTION
|
355
355
|
# Constructs the function call informatin.
|
356
356
|
#
|
@@ -404,7 +404,7 @@ module AdLint #:nodoc:
|
|
404
404
|
end
|
405
405
|
end
|
406
406
|
|
407
|
-
class
|
407
|
+
class XRefFun < CodeStructure
|
408
408
|
# === DESCRIPTION
|
409
409
|
# Constructs the cross reference information.
|
410
410
|
#
|
@@ -460,13 +460,23 @@ module AdLint #:nodoc:
|
|
460
460
|
end
|
461
461
|
|
462
462
|
class FunctionId
|
463
|
-
def
|
464
|
-
|
463
|
+
def self.of_ctors_section
|
464
|
+
# NOTE: To represent an object referrer of non-function in case of global
|
465
|
+
# function table initialization.
|
466
|
+
self.new(nil, nil)
|
467
|
+
end
|
468
|
+
|
469
|
+
def initialize(name, sig_str)
|
470
|
+
@name, @signature = name, sig_str
|
465
471
|
end
|
466
472
|
|
467
473
|
attr_reader :name
|
468
474
|
attr_reader :signature
|
469
475
|
|
476
|
+
def named?
|
477
|
+
!@name.nil?
|
478
|
+
end
|
479
|
+
|
470
480
|
def to_a
|
471
481
|
[@name, @signature]
|
472
482
|
end
|