adlint 1.10.0 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/ChangeLog +197 -4
  2. data/MANIFEST +17 -0
  3. data/NEWS +23 -4
  4. data/etc/mesg.d/en_US/messages.yml +14 -1
  5. data/etc/mesg.d/ja_JP/messages.yml +14 -1
  6. data/features/message_detection/W0093.feature +87 -0
  7. data/features/message_detection/W0687.feature +25 -0
  8. data/features/message_detection/W0688.feature +63 -0
  9. data/features/message_detection/W0689.feature +46 -0
  10. data/features/message_detection/W0690.feature +35 -0
  11. data/features/message_detection/W0698.feature +3 -2
  12. data/features/message_detection/W0703.feature +1 -0
  13. data/features/message_detection/W0723.feature +34 -0
  14. data/features/message_detection/W0732.feature +158 -0
  15. data/features/message_detection/W0733.feature +158 -0
  16. data/features/message_detection/W0734.feature +322 -0
  17. data/features/message_detection/W0735.feature +322 -0
  18. data/features/message_detection/W1052.feature +66 -0
  19. data/features/message_detection/W9001.feature +33 -0
  20. data/features/message_detection/W9003.feature +131 -0
  21. data/lib/adlint/c/ctrlexpr.rb +51 -50
  22. data/lib/adlint/c/domain.rb +237 -223
  23. data/lib/adlint/c/expr.rb +6 -8
  24. data/lib/adlint/c/interp.rb +8 -11
  25. data/lib/adlint/c/message.rb +20 -0
  26. data/lib/adlint/c/message_shima.rb +63 -0
  27. data/lib/adlint/c/object.rb +5 -4
  28. data/lib/adlint/c/operator.rb +99 -0
  29. data/lib/adlint/c/parser.rb +2 -2
  30. data/lib/adlint/c/parser.y +2 -2
  31. data/lib/adlint/c/phase.rb +6 -1
  32. data/lib/adlint/c/syntax.rb +442 -30
  33. data/lib/adlint/c/type.rb +449 -363
  34. data/lib/adlint/c/value.rb +96 -25
  35. data/lib/adlint/c.rb +1 -0
  36. data/lib/adlint/prelude.rb +16 -18
  37. data/lib/adlint/version.rb +2 -2
  38. data/share/doc/developers_guide_ja.html +11 -5
  39. data/share/doc/developers_guide_ja.texi +9 -3
  40. data/share/doc/users_guide_en.html +697 -131
  41. data/share/doc/users_guide_en.texi +491 -41
  42. data/share/doc/users_guide_ja.html +709 -139
  43. data/share/doc/users_guide_ja.texi +499 -45
  44. data/spec/adlint/c/ctrlexpr_spec.rb +168 -0
  45. data/spec/adlint/c/domain_spec.rb +835 -0
  46. data/spec/adlint/c/operator_spec.rb +406 -0
  47. data/spec/adlint/c/syntax_spec.rb +717 -0
  48. data/spec/adlint/c/type_spec.rb +55 -30
  49. metadata +19 -2
@@ -428,16 +428,24 @@ module C #:nodoc:
428
428
  }
429
429
  end
430
430
 
431
+ def logical?
432
+ subclass_responsibility
433
+ end
434
+
435
+ def arithmetic?
436
+ subclass_responsibility
437
+ end
438
+
439
+ def bitwise?
440
+ subclass_responsibility
441
+ end
442
+
431
443
  def object_specifiers
432
444
  ObjectSpecifierCollector.new.tap { |collector|
433
445
  self.accept(collector)
434
446
  }.object_specifiers
435
447
  end
436
448
 
437
- def logical?
438
- subclass_responsibility
439
- end
440
-
441
449
  def to_s
442
450
  subclass_responsibility
443
451
  end
@@ -461,6 +469,14 @@ module C #:nodoc:
461
469
  false
462
470
  end
463
471
 
472
+ def arithmetic?
473
+ false
474
+ end
475
+
476
+ def bitwise?
477
+ false
478
+ end
479
+
464
480
  def to_s
465
481
  @error_token.value
466
482
  end
@@ -471,15 +487,7 @@ module C #:nodoc:
471
487
  end
472
488
  end
473
489
 
474
- class PrimaryExpression < Expression
475
- def have_side_effect?
476
- false
477
- end
478
-
479
- def logical?
480
- false
481
- end
482
- end
490
+ class PrimaryExpression < Expression; end
483
491
 
484
492
  class ObjectSpecifier < PrimaryExpression
485
493
  def initialize(identifier)
@@ -493,10 +501,22 @@ module C #:nodoc:
493
501
  @identifier.location
494
502
  end
495
503
 
504
+ def have_side_effect?
505
+ false
506
+ end
507
+
496
508
  def logical?
497
509
  false
498
510
  end
499
511
 
512
+ def arithmetic?
513
+ false
514
+ end
515
+
516
+ def bitwise?
517
+ false
518
+ end
519
+
500
520
  def to_s
501
521
  @identifier.value
502
522
  end
@@ -531,10 +551,22 @@ module C #:nodoc:
531
551
  @constant.value =~ /'.*'/
532
552
  end
533
553
 
554
+ def have_side_effect?
555
+ false
556
+ end
557
+
534
558
  def logical?
535
559
  false
536
560
  end
537
561
 
562
+ def arithmetic?
563
+ false
564
+ end
565
+
566
+ def bitwise?
567
+ false
568
+ end
569
+
538
570
  def to_s
539
571
  @constant.value
540
572
  end
@@ -561,10 +593,22 @@ module C #:nodoc:
561
593
  @literal.value.scan(/\AL/i).first
562
594
  end
563
595
 
596
+ def have_side_effect?
597
+ false
598
+ end
599
+
564
600
  def logical?
565
601
  false
566
602
  end
567
603
 
604
+ def arithmetic?
605
+ false
606
+ end
607
+
608
+ def bitwise?
609
+ false
610
+ end
611
+
568
612
  def to_s
569
613
  @literal.value
570
614
  end
@@ -587,10 +631,22 @@ module C #:nodoc:
587
631
  @token.location
588
632
  end
589
633
 
634
+ def have_side_effect?
635
+ false
636
+ end
637
+
590
638
  def logical?
591
639
  false
592
640
  end
593
641
 
642
+ def arithmetic?
643
+ false
644
+ end
645
+
646
+ def bitwise?
647
+ false
648
+ end
649
+
594
650
  def to_s
595
651
  @token.value
596
652
  end
@@ -621,6 +677,14 @@ module C #:nodoc:
621
677
  @expression.logical?
622
678
  end
623
679
 
680
+ def arithmetic?
681
+ @expression.arithmetic?
682
+ end
683
+
684
+ def bitwise?
685
+ @expression.bitwise?
686
+ end
687
+
624
688
  def to_s
625
689
  "(#{expression.to_s})"
626
690
  end
@@ -641,10 +705,6 @@ module C #:nodoc:
641
705
  def location
642
706
  @operator.location
643
707
  end
644
-
645
- def logical?
646
- false
647
- end
648
708
  end
649
709
 
650
710
  class ArraySubscriptExpression < PostfixExpression
@@ -661,6 +721,18 @@ module C #:nodoc:
661
721
  @expression.have_side_effect? || @array_subscript.have_side_effect?
662
722
  end
663
723
 
724
+ def logical?
725
+ false
726
+ end
727
+
728
+ def arithmetic?
729
+ false
730
+ end
731
+
732
+ def bitwise?
733
+ false
734
+ end
735
+
664
736
  def to_s
665
737
  "#{@expression.to_s}[#{@array_subscript.to_s}]"
666
738
  end
@@ -686,6 +758,18 @@ module C #:nodoc:
686
758
  true
687
759
  end
688
760
 
761
+ def logical?
762
+ false
763
+ end
764
+
765
+ def arithmetic?
766
+ false
767
+ end
768
+
769
+ def bitwise?
770
+ false
771
+ end
772
+
689
773
  def to_s
690
774
  "#{@expression.to_s}(" +
691
775
  @argument_expressions.map { |expr| expr.to_s }.join(",") + ")"
@@ -712,6 +796,18 @@ module C #:nodoc:
712
796
  @expression.have_side_effect?
713
797
  end
714
798
 
799
+ def logical?
800
+ false
801
+ end
802
+
803
+ def arithmetic?
804
+ false
805
+ end
806
+
807
+ def bitwise?
808
+ false
809
+ end
810
+
715
811
  def to_s
716
812
  "#{@expression.to_s}.#{@identifier.value}"
717
813
  end
@@ -736,6 +832,18 @@ module C #:nodoc:
736
832
  @expression.have_side_effect?
737
833
  end
738
834
 
835
+ def logical?
836
+ false
837
+ end
838
+
839
+ def arithmetic?
840
+ false
841
+ end
842
+
843
+ def bitwise?
844
+ false
845
+ end
846
+
739
847
  def to_s
740
848
  "#{@expression.to_s}->#{@identifier.value}"
741
849
  end
@@ -760,6 +868,18 @@ module C #:nodoc:
760
868
  @expression.have_side_effect?
761
869
  end
762
870
 
871
+ def logical?
872
+ false
873
+ end
874
+
875
+ def arithmetic?
876
+ false
877
+ end
878
+
879
+ def bitwise?
880
+ false
881
+ end
882
+
763
883
  def to_s
764
884
  "#{@expression.to_s}.#{@constant.value}"
765
885
  end
@@ -784,6 +904,18 @@ module C #:nodoc:
784
904
  @expression.have_side_effect?
785
905
  end
786
906
 
907
+ def logical?
908
+ false
909
+ end
910
+
911
+ def arithmetic?
912
+ false
913
+ end
914
+
915
+ def bitwise?
916
+ false
917
+ end
918
+
787
919
  def to_s
788
920
  "#{@expression.to_s}->#{@constant.value}"
789
921
  end
@@ -795,7 +927,7 @@ module C #:nodoc:
795
927
  end
796
928
 
797
929
  class PostfixIncrementExpression < PostfixExpression
798
- def initialize(operand, operator)
930
+ def initialize(operator, operand)
799
931
  super(operator)
800
932
  @operand = operand
801
933
  end
@@ -806,6 +938,18 @@ module C #:nodoc:
806
938
  true
807
939
  end
808
940
 
941
+ def logical?
942
+ false
943
+ end
944
+
945
+ def arithmetic?
946
+ true
947
+ end
948
+
949
+ def bitwise?
950
+ false
951
+ end
952
+
809
953
  def to_s
810
954
  "#{@operand.to_s}++"
811
955
  end
@@ -817,7 +961,7 @@ module C #:nodoc:
817
961
  end
818
962
 
819
963
  class PostfixDecrementExpression < PostfixExpression
820
- def initialize(operand, operator)
964
+ def initialize(operator, operand)
821
965
  super(operator)
822
966
  @operand = operand
823
967
  end
@@ -828,6 +972,18 @@ module C #:nodoc:
828
972
  true
829
973
  end
830
974
 
975
+ def logical?
976
+ false
977
+ end
978
+
979
+ def arithmetic?
980
+ true
981
+ end
982
+
983
+ def bitwise?
984
+ false
985
+ end
986
+
831
987
  def to_s
832
988
  "#{@operand.to_s}--"
833
989
  end
@@ -852,6 +1008,18 @@ module C #:nodoc:
852
1008
  false
853
1009
  end
854
1010
 
1011
+ def logical?
1012
+ false
1013
+ end
1014
+
1015
+ def arithmetic?
1016
+ false
1017
+ end
1018
+
1019
+ def bitwise?
1020
+ false
1021
+ end
1022
+
855
1023
  def to_s
856
1024
  "(#{@type_name.to_s}){" +
857
1025
  @initializers.map { |ini| ini.to_s }.join(",") + "}"
@@ -877,10 +1045,6 @@ module C #:nodoc:
877
1045
  @operator.location
878
1046
  end
879
1047
 
880
- def have_side_effect?
881
- @operand.have_side_effect?
882
- end
883
-
884
1048
  def to_s
885
1049
  @operator.value + @operand.to_s
886
1050
  end
@@ -899,6 +1063,14 @@ module C #:nodoc:
899
1063
  def logical?
900
1064
  false
901
1065
  end
1066
+
1067
+ def arithmetic?
1068
+ true
1069
+ end
1070
+
1071
+ def bitwise?
1072
+ false
1073
+ end
902
1074
  end
903
1075
 
904
1076
  class PrefixDecrementExpression < UnaryExpression
@@ -909,31 +1081,87 @@ module C #:nodoc:
909
1081
  def logical?
910
1082
  false
911
1083
  end
1084
+
1085
+ def arithmetic?
1086
+ true
1087
+ end
1088
+
1089
+ def bitwise?
1090
+ false
1091
+ end
912
1092
  end
913
1093
 
914
1094
  class AddressExpression < UnaryExpression
1095
+ def have_side_effect?
1096
+ operand.have_side_effect?
1097
+ end
1098
+
915
1099
  def logical?
916
1100
  false
917
1101
  end
1102
+
1103
+ def arithmetic?
1104
+ false
1105
+ end
1106
+
1107
+ def bitwise?
1108
+ false
1109
+ end
918
1110
  end
919
1111
 
920
1112
  class IndirectionExpression < UnaryExpression
1113
+ def have_side_effect?
1114
+ operand.have_side_effect?
1115
+ end
1116
+
921
1117
  def logical?
922
1118
  false
923
1119
  end
1120
+
1121
+ def arithmetic?
1122
+ false
1123
+ end
1124
+
1125
+ def bitwise?
1126
+ false
1127
+ end
924
1128
  end
925
1129
 
926
1130
  class UnaryArithmeticExpression < UnaryExpression
1131
+ def have_side_effect?
1132
+ operand.have_side_effect?
1133
+ end
1134
+
927
1135
  def logical?
928
- @operator.type == "!"
1136
+ operator.type == "!"
1137
+ end
1138
+
1139
+ def arithmetic?
1140
+ false
1141
+ end
1142
+
1143
+ def bitwise?
1144
+ operator.type == "~"
929
1145
  end
930
1146
  end
931
1147
 
932
1148
  class SizeofExpression < UnaryExpression
1149
+ def have_side_effect?
1150
+ false
1151
+ end
1152
+
933
1153
  def logical?
934
1154
  false
935
1155
  end
936
1156
 
1157
+ def arithmetic?
1158
+ false
1159
+ end
1160
+
1161
+ def bitwise?
1162
+ false
1163
+ end
1164
+
937
1165
  def to_s
938
1166
  "sizeof(#{@operand.to_s})"
939
1167
  end
@@ -948,16 +1176,36 @@ module C #:nodoc:
948
1176
  false
949
1177
  end
950
1178
 
1179
+ def arithmetic?
1180
+ false
1181
+ end
1182
+
1183
+ def bitwise?
1184
+ false
1185
+ end
1186
+
951
1187
  def to_s
952
1188
  "sizeof(#{@operand.to_s})"
953
1189
  end
954
1190
  end
955
1191
 
956
1192
  class AlignofExpression < UnaryExpression
1193
+ def have_side_effect?
1194
+ false
1195
+ end
1196
+
957
1197
  def logical?
958
1198
  false
959
1199
  end
960
1200
 
1201
+ def arithmetic?
1202
+ false
1203
+ end
1204
+
1205
+ def bitwise?
1206
+ false
1207
+ end
1208
+
961
1209
  def to_s
962
1210
  "alignof(#{@operand.to_s})"
963
1211
  end
@@ -972,6 +1220,14 @@ module C #:nodoc:
972
1220
  false
973
1221
  end
974
1222
 
1223
+ def arithmetic?
1224
+ false
1225
+ end
1226
+
1227
+ def bitwise?
1228
+ false
1229
+ end
1230
+
975
1231
  def to_s
976
1232
  "alignof(#{@operand.to_s})"
977
1233
  end
@@ -996,7 +1252,15 @@ module C #:nodoc:
996
1252
  end
997
1253
 
998
1254
  def logical?
999
- false
1255
+ @operand.logical?
1256
+ end
1257
+
1258
+ def arithmetic?
1259
+ @operand.arithmetic?
1260
+ end
1261
+
1262
+ def bitwise?
1263
+ @operand.bitwise?
1000
1264
  end
1001
1265
 
1002
1266
  def to_s
@@ -1025,10 +1289,6 @@ module C #:nodoc:
1025
1289
  @operator.location
1026
1290
  end
1027
1291
 
1028
- def have_side_effect?
1029
- lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1030
- end
1031
-
1032
1292
  def to_s
1033
1293
  "#{@lhs_operand.to_s} #{@operator.value} #{@rhs_operand.to_s}"
1034
1294
  end
@@ -1040,51 +1300,147 @@ module C #:nodoc:
1040
1300
  end
1041
1301
 
1042
1302
  class MultiplicativeExpression < BinaryExpression
1303
+ def have_side_effect?
1304
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1305
+ end
1306
+
1043
1307
  def logical?
1044
1308
  false
1045
1309
  end
1310
+
1311
+ def arithmetic?
1312
+ true
1313
+ end
1314
+
1315
+ def bitwise?
1316
+ false
1317
+ end
1046
1318
  end
1047
1319
 
1048
1320
  class AdditiveExpression < BinaryExpression
1321
+ def have_side_effect?
1322
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1323
+ end
1324
+
1049
1325
  def logical?
1050
1326
  false
1051
1327
  end
1328
+
1329
+ def arithmetic?
1330
+ true
1331
+ end
1332
+
1333
+ def bitwise?
1334
+ false
1335
+ end
1052
1336
  end
1053
1337
 
1054
1338
  class ShiftExpression < BinaryExpression
1339
+ def have_side_effect?
1340
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1341
+ end
1342
+
1055
1343
  def logical?
1056
1344
  false
1057
1345
  end
1346
+
1347
+ def arithmetic?
1348
+ false
1349
+ end
1350
+
1351
+ def bitwise?
1352
+ true
1353
+ end
1058
1354
  end
1059
1355
 
1060
1356
  class RelationalExpression < BinaryExpression
1357
+ def have_side_effect?
1358
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1359
+ end
1360
+
1061
1361
  def logical?
1062
1362
  true
1063
1363
  end
1364
+
1365
+ def arithmetic?
1366
+ false
1367
+ end
1368
+
1369
+ def bitwise?
1370
+ false
1371
+ end
1064
1372
  end
1065
1373
 
1066
1374
  class EqualityExpression < BinaryExpression
1375
+ def have_side_effect?
1376
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1377
+ end
1378
+
1067
1379
  def logical?
1068
1380
  true
1069
1381
  end
1382
+
1383
+ def arithmetic?
1384
+ false
1385
+ end
1386
+
1387
+ def bitwise?
1388
+ false
1389
+ end
1070
1390
  end
1071
1391
 
1072
1392
  class AndExpression < BinaryExpression
1393
+ def have_side_effect?
1394
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1395
+ end
1396
+
1073
1397
  def logical?
1074
1398
  false
1075
1399
  end
1400
+
1401
+ def arithmetic?
1402
+ false
1403
+ end
1404
+
1405
+ def bitwise?
1406
+ true
1407
+ end
1076
1408
  end
1077
1409
 
1078
1410
  class ExclusiveOrExpression < BinaryExpression
1411
+ def have_side_effect?
1412
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1413
+ end
1414
+
1079
1415
  def logical?
1080
1416
  false
1081
1417
  end
1418
+
1419
+ def arithmetic?
1420
+ false
1421
+ end
1422
+
1423
+ def bitwise?
1424
+ true
1425
+ end
1082
1426
  end
1083
1427
 
1084
1428
  class InclusiveOrExpression < BinaryExpression
1429
+ def have_side_effect?
1430
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1431
+ end
1432
+
1085
1433
  def logical?
1086
1434
  false
1087
1435
  end
1436
+
1437
+ def arithmetic?
1438
+ false
1439
+ end
1440
+
1441
+ def bitwise?
1442
+ true
1443
+ end
1088
1444
  end
1089
1445
 
1090
1446
  class LogicalAndExpression < BinaryExpression
@@ -1104,9 +1460,21 @@ module C #:nodoc:
1104
1460
  @lhs_operand.append_sequence_point!
1105
1461
  end
1106
1462
 
1463
+ def have_side_effect?
1464
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1465
+ end
1466
+
1107
1467
  def logical?
1108
1468
  true
1109
1469
  end
1470
+
1471
+ def arithmetic?
1472
+ false
1473
+ end
1474
+
1475
+ def bitwise?
1476
+ false
1477
+ end
1110
1478
  end
1111
1479
 
1112
1480
  class LogicalOrExpression < BinaryExpression
@@ -1126,9 +1494,21 @@ module C #:nodoc:
1126
1494
  @lhs_operand.append_sequence_point!
1127
1495
  end
1128
1496
 
1497
+ def have_side_effect?
1498
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
1499
+ end
1500
+
1129
1501
  def logical?
1130
1502
  true
1131
1503
  end
1504
+
1505
+ def arithmetic?
1506
+ false
1507
+ end
1508
+
1509
+ def bitwise?
1510
+ false
1511
+ end
1132
1512
  end
1133
1513
 
1134
1514
  class ConditionalExpression < Expression
@@ -1174,6 +1554,14 @@ module C #:nodoc:
1174
1554
  @then_expression.logical? || @else_expression.logical?
1175
1555
  end
1176
1556
 
1557
+ def arithmetic?
1558
+ @then_expression.arithmetic? || @else_expression.arithmetic?
1559
+ end
1560
+
1561
+ def bitwise?
1562
+ @then_expression.bitwise? || @else_expression.bitwise?
1563
+ end
1564
+
1177
1565
  def to_s
1178
1566
  "#{@condition.to_s} ? " +
1179
1567
  "#{@then_expression.to_s} : #{@else_expression.to_s}"
@@ -1193,7 +1581,15 @@ module C #:nodoc:
1193
1581
  end
1194
1582
 
1195
1583
  def logical?
1196
- @rhs_operand.logical?
1584
+ rhs_operand.logical?
1585
+ end
1586
+
1587
+ def arithmetic?
1588
+ rhs_operand.arithmetic?
1589
+ end
1590
+
1591
+ def bitwise?
1592
+ rhs_operand.bitwise?
1197
1593
  end
1198
1594
  end
1199
1595
 
@@ -1205,6 +1601,14 @@ module C #:nodoc:
1205
1601
  def logical?
1206
1602
  false
1207
1603
  end
1604
+
1605
+ def arithmetic?
1606
+ ["*=", "/=", "%=", "+=", "-="].include?(operator.type)
1607
+ end
1608
+
1609
+ def bitwise?
1610
+ ["<<=", ">>=", "&=", "^=", "|="].include?(operator.type)
1611
+ end
1208
1612
  end
1209
1613
 
1210
1614
  class CommaSeparatedExpression < Expression
@@ -1228,6 +1632,14 @@ module C #:nodoc:
1228
1632
  @expressions.last.logical?
1229
1633
  end
1230
1634
 
1635
+ def arithmetic?
1636
+ @expressions.last.arithmetic?
1637
+ end
1638
+
1639
+ def bitwise?
1640
+ @expressions.last.bitwise?
1641
+ end
1642
+
1231
1643
  def to_s
1232
1644
  @expressions.map { |expr| expr.to_s }.join(",")
1233
1645
  end