adlint 1.10.0 → 1.12.0

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.
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