adlint 3.0.4 → 3.0.8
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 +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
|