forked from Qihoo360/safe-rules
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathc-cpp-rules.json
More file actions
3258 lines (3256 loc) · 174 KB
/
c-cpp-rules.json
File metadata and controls
3258 lines (3256 loc) · 174 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"name": "C/C++安全规则集合",
"version": "1.1.0",
"encoding": "utf-8",
"//": [
"checkPoint是规则的描述",
"comment是规则针对问题的简要说明",
"config是相关配置项的名称及含义",
"standard是相关ISO/IEC标准",
"reference是规则的参考条目,由逗号分隔",
"level是严重性等级,分为error、warning、suggestion、suspicious",
"error:错误代码",
"warning:有严重错误倾向的代码",
"suggestion:优化建议",
"suspicious:可疑的代码,不一定有实际错误",
"tags是进一步细化的分类"
],
"ID_sizeof_oddExpression": {
"checkPoint": "sizeof 不应作用于逻辑表达式",
"level": "warning",
"comment": "sizeof作用于 <、>、<=、>=、==、!=、&&、|| 等逻辑表达式为常见笔误,逻辑运算符往往应该移出 sizeof 表达式。",
"tag": "expression"
},
"ID_sizeof_pointerDivision": {
"checkPoint": "被除数不应是作用于指针的 sizeof 表达式",
"level": "warning",
"comment": "形如 sizeof(p)/n 的表达式往往是为了获取数组元素的个数,如果 p 是指针,sizeof(p) 只是指针变量的大小,并不是数组的大小,所以这种表达式往往意味着逻辑错误。",
"tag": "expression",
"related": "ID_sizeof_pointer",
"reference": "CWE-467"
},
"ID_sizeof_void": {
"checkPoint": "sizeof 不可作用于 void",
"level": "error",
"comment": "void 表示不存在的类型,也是不完整的类型,sizeof 作用于 void 是没意义的,属于语言运用错误,也可能是 sizeof(void*) 的笔误。",
"tag": "expression",
"standard": "ISO/IEC 9899:1999 6.3.2.2(1),ISO/IEC 9899:1999 6.2.5(19)"
},
"ID_differentEnumComparison": {
"checkPoint": "不应比较非同类枚举值",
"level": "warning",
"comment": "比较非同类枚举值相当于比较不同类别的事物,没有逻辑意义,往往是设计缺陷或逻辑错误。",
"tag": "expression"
},
"ID_ptrIntCast": {
"checkPoint": "指针与整数不应相互转换",
"level": "warning",
"comment": "指针转为整数,或整数转为指针(尤其是小于 64 位的整数或有符号的整数),容易造成地址不完整、寻址错误、降低可移植性等问题。",
"config": {
"allowPointerToSizeType": "为 true 时可以放过指针与 size_t 的转换"
},
"tag": "cast",
"standard": "ISO/IEC 9899:2011 6.3.2.3(5)-implementation,ISO/IEC 14882:2011 5.2.10(4 5)-implementation",
"related": "ID_fixedAddrToPointer",
"reference": "SEI CERT INT36-C,MISRA C 2004 11.3,MISRA C 2012 11.4,MISRA C++ 2008 5-2-8,MISRA C++ 2008 5-2-9"
},
"ID_zeroAsPtrValue": {
"checkPoint": "不应使用常数 0 对指针赋值",
"level": "suggestion",
"comment": "不应使用常数 0 对指针赋值,在 C++ 代码中应使用 nullptr,在 C 代码中应使用 NULL,否则易出现类型转换相关的错误,且不利于阅读。",
"tag": "pointer",
"reference": "MISRA C++ 2008 4-10-2,C++ Core Guidelines ES.47"
},
"ID_charWCharCast": {
"checkPoint": "不可直接转换不同的字符串类型",
"level": "warning",
"comment": "char* 和 wchar_t* 直接转换并不进行字符集编码转换,往往意味着语言运用错误,char*、wchar_t*、char16_t* 和 char32_t* 之间均不可直接转换。",
"tag": "cast",
"related": "ID_castNoInheritance,ID_plainBinaryChar",
"reference": "CWE-704,SEI CERT STR38-C"
},
"ID_repeatedUnaryOperators": {
"checkPoint": "不应重复使用一元运算符",
"level": "warning",
"comment": "重复的一元运算符没有意义,为常见笔误。",
"tag": "expression"
},
"ID_minusOnUnsigned": {
"checkPoint": "负号不应作用于无符号整数",
"level": "warning",
"comment": "负号作用于无符号整数,结果仍是无符号整数,令人费解易产生意料之外的错误。",
"tag": "expression",
"standard": "ISO/IEC 9899:1999 6.5.3.3(3),ISO/IEC 9899:2011 6.5.3.3(3)",
"reference": "MISRA C 2004 12.9,MISRA C 2012 10.1,MISRA C++ 2008 5-3-2"
},
"ID_bitwiseOperOnSigned": {
"checkPoint": "位运算符不应作用于有符号整数",
"level": "warning",
"comment": "符号位在位运算方面没有逻辑意义,对负数进行位运算往往意味着逻辑错误。",
"tag": "expression",
"standard": "ISO/IEC 14882:2011 5.8(2)-undefined,ISO/IEC 14882:2011 5.8(3)-implementation",
"reference": "CWE-682,MISRA C 2004 12.7,MISRA C 2012 10.1,MISRA C++ 2008 5-0-21,C++ Core Guidelines ES.101"
},
"ID_simplifiableTernary": {
"checkPoint": "可化简为逻辑表达式的三元表达式应尽量化简",
"level": "suggestion",
"comment": "当三元表达式的分枝是 true 或 false 时可化简为逻辑表达式,应化简代码。",
"tag": "expression"
},
"ID_stickyAssignmentOperator": {
"checkPoint": "赋值运算符与一元运算符之间应有空格,一元运算符与变量或表达式之间不应有空格",
"level": "warning",
"comment": "如果 = 与 +、-、*、!、&、~ 等一元运算符之间没有空格,而一元运算符与其子表达式之间有空格,是一种非常怪异的格式,也可能是 +=、-=、*=、&=、~= 等复合赋值运算符的笔误。",
"tag": "expression",
"reference": "CWE-480"
},
"ID_redundantParentheses": {
"checkPoint": "合理使用括号",
"level": "suggestion",
"comment": "重复的、作用于单个对象或一元运算符的括号使代码显得繁琐,应去掉,但如果可以更好的表达逻辑意义,或不确定运算符优先级时,应使用括号。",
"tag": "expression"
},
"ID_throwNULL": {
"checkPoint": "不应抛出 NULL",
"level": "warning",
"comment": "在 C++ 语言中,虽然 NULL 表示空指针,然而在多数环境中 throw NULL 相当于 throw 0,类型的不明确会造成对异常的错误捕捉。",
"tag": "exception",
"related": "ID_deprecatedNULL,ID_throwNonExceptionType,ID_throwPointer",
"standard": "ISO/IEC 14882:2003 C.2.2.3(1)-implementation,ISO/IEC 14882:2011 C.3.2.4(1)-implementation,ISO/IEC 14882:2017 C.5.2.7(1)-implementation",
"reference": "CWE-351,MISRA C++ 2008 15-1-2"
},
"ID_throwNullptr": {
"checkPoint": "不应抛出 nullptr",
"level": "warning",
"comment": "nullptr 可被所有接受指针的 catch 块捕捉,使异常处理失去针对性,故不应抛出 nullptr。",
"tag": "exception",
"related": "ID_throwPointer",
"reference": "MISRA C++ 2008 15-0-2"
},
"ID_throwNonExceptionType": {
"checkPoint": "不应抛出非异常类型的对象",
"level": "warning",
"comment": "字符串或普通变量以及非异常相关的对象不应被当作异常抛出,否则意味着异常相关的设计是不健全的。",
"tag": "exception",
"related": "ID_catch_nonExceptionType",
"reference": "C++ Core Guidelines E.14,C++ Core Guidelines E.3"
},
"ID_throwGenericException": {
"checkPoint": "不应抛出过于宽泛的异常",
"level": "warning",
"comment": "抛出过于宽泛的异常如 std::exception、std::logic_error、std::runtime_error 等,使异常处理失去针对性,无法做到具体问题具体处理,而且处理这种异常时很可能将本不应处理的异常一并捕获,造成混乱。",
"tag": "exception",
"related": "ID_catch_generic",
"reference": "CWE-397"
},
"ID_rethrowOutOfCatch": {
"checkPoint": "不应在 catch 块外使用空 throw 表达式(throw;)",
"level": "warning",
"comment": "空 throw 表达式用于重新抛出当前捕获的异常,用在 catch 块外是危险的,增大了流程控制的复杂性。",
"tag": "exception",
"standard": "ISO/IEC 14882:2003 15.1(6 8),ISO/IEC 14882:2003 15.3(9)-implementation,ISO/IEC 14882:2011 15.1(8 9),ISO/IEC 14882:2011 15.3(9)-implementation",
"reference": "MISRA C++ 2008 15-1-3"
},
"ID_improperRethrow": {
"checkPoint": "重新抛出异常时应使用空 throw 表达式(throw;)",
"level": "warning",
"comment": "重新抛出异常时应使用空 throw 表达式,避免异常对象的精度损失或不必要的复制。",
"tag": "exception",
"standard": "ISO/IEC 14882:2003 15.1(6),ISO/IEC 14882:2011 15.1(8)"
},
"ID_forbidException": {
"checkPoint": "禁用 C++ 异常",
"level": "warning",
"comment": "禁用 C++ 异常。",
"tag": "exception",
"related": "ID_exceptionUnsafe",
"reference": "C++ Core Guidelines E.6,Google C++ Style Guide.Other C++ Features.Exceptions"
},
"ID_invalidExternSpecifier": {
"checkPoint": "extern 关键字不应作用于类成员的声明或定义",
"level": "warning",
"comment": "extern 关键字作用于类成员的声明或定义是没有意义的,为语言用法错误。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2003 9.2(6),ISO/IEC 14882:2011 9.2(6),ISO/IEC 14882:2017 12.2(9)"
},
"ID_invalidParamArraySize": {
"checkPoint": "不应将数组作为函数的形式参数",
"level": "warning",
"comment": "在形式参数中对数组大小的声明起不到实际的限制作用。",
"tag": "declaration",
"standard": "ISO/IEC 9899:1999 6.7.5.3(7),ISO/IEC 9899:2011 6.7.6.3(7)",
"reference": "C++ Core Guidelines I.13,C++ Core Guidelines R.14,MISRA C++ 2008 5-2-12"
},
"ID_illMemberCall": {
"checkPoint": "基类对象构造完毕之前不可调用成员函数",
"level": "warning",
"comment": "基类对象未构造完毕时调用成员函数会导致标准未定义的错误。",
"tag": "function",
"standard": "ISO/IEC 14882:2011 12.6.2(13)-undefined"
},
"ID_incompleteVAMacros": {
"checkPoint": "va_start 或 va_copy 应配合 va_end 使用",
"level": "warning",
"comment": "可变参数列表相关的 va_start 或 va_copy 和 va_end 应在同一函数中使用,否则会导致标准未定义的错误。",
"tag": "function",
"related": "ID_forbidVariadicFunction",
"standard": "ISO/IEC 9899:2011 7.16.1.3(2)-undefined"
},
"ID_functionSpecialization": {
"checkPoint": "函数模版不应被特化",
"level": "warning",
"comment": "特化的函数模板不参与重载函数的选取,不属于常规用法,且容易造成混乱。",
"tag": "function",
"reference": "C++ Core Guidelines T.144,MISRA C++ 2008 14-8-1"
},
"ID_tooManyLines": {
"checkPoint": "函数的行数应在规定范围之内",
"level": "warning",
"comment": "函数体过大违反模块化编程理念,使人难以阅读,更不便于维护,很有可能隐藏着各种错误,应适当重构。",
"config": {
"maxLineCount": "行数上限,超过则报出"
},
"tag": "function",
"reference": "C++ Core Guidelines F.2,C++ Core Guidelines F.3"
},
"ID_unsuitableCapture": {
"checkPoint": "合理设置 lambda 表达式对变量的捕获方式",
"level": "warning",
"comment": "如果 lambda 表达式只在函数内部使用,可采用捕获引用的方式;如果 lambda 表达式可以超出函数作用域,应采用捕获值的方式。",
"tag": "function",
"standard": "ISO/IEC 14882:2011 5.1.2(7)",
"related": "ID_localAddressFlowOut",
"reference": "C++ Core Guidelines F.52,C++ Core Guidelines F.53,C++ Core Guidelines F.54"
},
"ID_tooManyLambdaLines": {
"checkPoint": "lambda 表达式的行数应在规定范围之内",
"level": "warning",
"comment": "复杂的 lambda 表达式与其调用者的代码混在一起时,是难以阅读的,引入 lambda 表达式的目的应该是“化简”,否则应使用普通函数。",
"config": {
"maxLambdaLineCount": "lambda 表达式行数上限,超过则报出"
},
"tag": "function"
},
"ID_tooManyLabels": {
"checkPoint": "函数的标签数量应在规定范围之内",
"level": "warning",
"comment": "标签过多意味着函数内部的跳转逻辑过于复杂,违反结构化设计理念,应适当重构。",
"config": {
"maxLabelCount": "标签数量上限,超过则报出"
},
"tag": "function"
},
"ID_memoryLeak": {
"checkPoint": "不可失去对已分配内存的控制",
"level": "warning",
"comment": "已分配内存的地址不可被遗失,否则相关内存无法被访问也无法被回收,这种问题称为“内存泄漏(memory leak)”,会导致可用内存被耗尽,使程序无法正确运行。",
"tag": "resource",
"related": "ID_resourceLeak,ID_ownerlessResource",
"reference": "C++ Core Guidelines P.8,C++ Core Guidelines E.13"
},
"ID_resourceLeak": {
"checkPoint": "不可失去对已分配资源的控制",
"level": "warning",
"comment": "已分配资源的指针、句柄或描述符等信息不可被遗失,否则相关资源无法被访问也无法被回收,会导致资源耗尽以及死锁等问题,使程序无法正确运行。",
"tag": "resource",
"related": "ID_memoryLeak",
"reference": "C++ Core Guidelines P.8,C++ Core Guidelines E.13"
},
"ID_insufficientDelete": {
"checkPoint": "用 delete 释放数组不可漏写中括号",
"level": "error",
"comment": "用 new 分配的数组应该用 delete[] 释放,不可漏写中括号,否则引发标准未定义的错误。",
"tag": "resource",
"related": "ID_excessiveDelete",
"standard": "ISO/IEC 14882:2003 5.3.5(2)-undefined,ISO/IEC 14882:2011 5.3.5(2)-undefined,ISO/IEC 14882:2017 8.3.5(2)-undefined",
"reference": "C++ Core Guidelines ES.61"
},
"ID_excessiveDelete": {
"checkPoint": "用 delete 释放对象不可多写中括号",
"level": "error",
"comment": "用 new 分配的对象应该用 delete 释放,不可用 delete[] 释放,否则引发标准未定义的错误。",
"tag": "resource",
"related": "ID_insufficientDelete",
"standard": "ISO/IEC 14882:2003 5.3.5(2)-undefined,ISO/IEC 14882:2011 5.3.5(2)-undefined,ISO/IEC 14882:2017 8.3.5(2)-undefined",
"reference": "C++ Core Guidelines ES.61"
},
"ID_incompatibleDealloc": {
"checkPoint": "资源的分配与回收方法应配套使用",
"level": "error",
"comment": "不同的分配回收方法属于不同的资源管理体系,如果不配套使用会引发严重错误。",
"tag": "resource",
"standard": "ISO/IEC 9899:2011 7.22.3.3(2)-undefined,ISO/IEC 9899:2011 7.22.3.4(3)-undefined",
"reference": "SEI CERT MEM51-CPP"
},
"ID_illAccess": {
"checkPoint": "不可访问未初始化或已释放的资源",
"level": "error",
"comment": "访问未初始化或已释放的资源属于逻辑错误,也会导致标准未定义的行为。",
"tag": "resource",
"related": "ID_danglingDeref,ID_localInitialization",
"standard": "ISO/IEC 9899:2011 7.22.3.3(2)-undefined,ISO/IEC 14882:2011 3.7.4.2(4)-undefined",
"reference": "SEI CERT FIO46-C"
},
"ID_illDealloc": {
"checkPoint": "在栈上分配的空间以及非动态申请的资源不可被释放",
"level": "error",
"comment": "释放在栈上分配的空间以及非动态申请的资源会导致标准未定义的错误。",
"standard": "ISO/IEC 9899:2011 7.22.3.3(2)-undefined,ISO/IEC 9899:2011 7.22.3.4(3)-undefined,ISO/IEC 14882:2011 3.7.4.2(4)-undefined",
"tag": "resource",
"reference": "MISRA C 2012 22.2"
},
"ID_doubleFree": {
"checkPoint": "资源不可被重复释放",
"level": "error",
"comment": "重复释放资源属于逻辑错误,也会导致标准未定义的问题。",
"tag": "resource",
"standard": "ISO/IEC 9899:2011 7.22.3.3(2)-undefined,ISO/IEC 14882:2011 3.7.4.2(4)-undefined",
"reference": "CWE-415"
},
"ID_invalidNullCheck": {
"checkPoint": "避免无效的空指针检查",
"level": "warning",
"comment": "当指针的值一定不为空时,再对其进行检查是没有意义的,往往意味着逻辑错误。",
"tag": "pointer",
"related": "ID_repeatedNullCheck",
"standard": "ISO/IEC 9899:2011 18.6"
},
"ID_repeatedNullCheck": {
"checkPoint": "不应重复检查指针是否为空",
"level": "warning",
"comment": "重复的空指针检查是不必要的,使代码显得繁琐,且干扰编译器优化。",
"tag": "pointer",
"related": "ID_invalidNullCheck"
},
"ID_copiedStream": {
"checkPoint": "流式资源对象不应被复制",
"level": "warning",
"comment": "FILE 等流式对象不应被复制,如果存在多个副本会造成数据不一致的问题。",
"tag": "resource",
"standard": "ISO/IEC 9899:1999 7.19.3(6),ISO/IEC 9899:2011 7.21.3(6)",
"reference": "MISRA C 2012 22.5"
},
"ID_arrayIndexOverflow": {
"checkPoint": "数组下标不可越界",
"level": "error",
"comment": "数组下标不在数组声明的大小范围之内,意味着内存读写错误,会导致难以控制的后果。",
"tag": "buffer",
"related": "ID_bufferOverflow",
"reference": "CWE-119,CWE-125,CWE-131,CWE-787,CWE-788,C++ Core Guidelines ES.103,SEI CERT ARR30-C"
},
"ID_oddSubscripting": {
"checkPoint": "数组下标应为整形表达式",
"level": "warning",
"comment": "C/C++ 语言规定,数组下标可以在中括号的右侧也可以在左侧,然而这只是一种理论上的设计,在实际代码中,应采用约定俗成的方式,即数组的名称在中括号的左侧,下标在中括号的右侧。",
"tag": "expression",
"standard": "ISO/IEC 14882:2003 8.3.4(6),ISO/IEC 14882:2011 8.3.4(6)"
},
"ID_plainSensitiveInfo": {
"checkPoint": "敏感数据不可写入代码",
"level": "warning",
"comment": "代码中的敏感数据极易泄露,产品以及相关运维、测试工具的代码均不可记录任何敏感数据。",
"tag": "security",
"related": "ID_secretLeak",
"reference": "CWE-798,CWE-259,SEI CERT MSC41-C"
},
"ID_throwPointer": {
"checkPoint": "不应将指针作为异常抛出",
"level": "suggestion",
"comment": "如果将指针作为异常抛出,并且该指针指向动态创建的对象,会增加不必要的内存管理开销,也容易造成意料之外的错误。",
"tag": "exception",
"reference": "MISRA C++ 2008 15-0-2"
},
"ID_if_tooManyElseIf": {
"checkPoint": "if...else-if 分枝数量应在规定范围之内",
"level": "warning",
"comment": "if...else-if 分枝超过指定数量,代码较为复杂不利于维护,而且在执行时各分枝的条件需逐一判断,效率较低,建议改为遵循某种算法的索引结构。",
"config": {
"maxElseIfCount": "分枝数量上限,超过则报出"
},
"tag": "control"
},
"ID_for_floatCounter": {
"checkPoint": "for 循环变量不应为浮点型",
"level": "warning",
"comment": "用于控制循环次数的变量称为循环变量,这种变量不应采用浮点类型,否则循环的次数难以控制。",
"tag": "control",
"related": "ID_illFloatComparison",
"reference": "MISRA C 2004 13.4,MISRA C 2012 14.1,MISRA C++ 2008 6-5-1"
},
"ID_for_counterChangedInBody": {
"checkPoint": "for 循环变量不应在循环体内被改变",
"level": "warning",
"comment": "用于控制循环次数的变量称为循环变量,这种变量只应在 for 迭代声明的第 3 个表达式中被改变,否则陡增逻辑复杂度,且可读性较差。",
"tag": "control",
"reference": "C++ Core Guidelines ES.86,MISRA C 2004 13.6,MISRA C++ 2008 6-5-3"
},
"ID_for_counterNested": {
"checkPoint": "嵌套的 for 循环不应使用相同的循环变量",
"level": "warning",
"comment": "同一个循环变量在内外层 for 循环中均被修改,使循环次数难以控制,是过于复杂的循环逻辑,也可能是某种错误。",
"tag": "control",
"related": "ID_for_counterChangedInBody"
},
"ID_for_emptyBlock": {
"checkPoint": "for 循环体不应为空",
"level": "warning",
"comment": "空的 for 循环将逻辑功能全部压缩到了迭代表达式中,可读性较差。",
"tag": "control",
"reference": "C++ Core Guidelines ES.85"
},
"ID_switch_caseOutOfRange": {
"checkPoint": "case 常量的范围不可超出 switch 变量的范围",
"level": "warning",
"comment": "如果 case 常量的范围超出了 switch 变量的范围,会导致相应分枝永远不会被执行。",
"tag": "control",
"related": "ID_illComparison",
"reference": "CWE-561"
},
"ID_switch_uselessFallThrough": {
"checkPoint": "不应存在紧邻 default 标签的空 case 标签",
"level": "warning",
"comment": "紧邻 default 标签的空 case 标签是没有意义的,应当去除。",
"tag": "control"
},
"ID_switch_onlyDefault": {
"checkPoint": "switch 语句不应只包含 default 标签",
"level": "warning",
"comment": "只有 default 标签的 switch 语句是没有意义的,起不到分枝选择的作用,往往是残留代码或功能未实现。",
"tag": "control",
"reference": "MISRA C 2012 16.6"
},
"ID_switch_onlyOneCase": {
"checkPoint": "switch 语句不应只包含一个 case 标签",
"level": "warning",
"comment": "只有一个 case 标签的 switch 语句与 if 语句语义相同,但形式上更为复杂,应改为 if 语句。",
"tag": "control",
"reference": "MISRA C 2012 16.6"
},
"ID_switch_tooManyCases": {
"checkPoint": "switch 语句分枝数量应在规定范围之内",
"level": "warning",
"comment": "switch 语句分枝过多会使代码过于庞大不利于维护,分枝很多时建议将每个 case 的执行逻辑抽取成函数,再按遵循某种算法的索引结构组织在一起。",
"config": {
"maxCasesCount": "分枝数量上限,超过则报出"
},
"tag": "control"
},
"ID_switch_brace": {
"checkPoint": "switch 语句应该用大括号括起来",
"level": "suggestion",
"comment": "switch 语句应为包含多条语句的复合语句,且用大括号括起来,否则不应选用 switch 语句。",
"tag": "control",
"related": "ID_if_brace,ID_switch_onlyDefault,ID_switch_onlyOneCase",
"reference": "MISRA C 2004 14.8,MISRA C 2012 15.6,MISRA C++ 2008 6-3-1"
},
"ID_switch_forbidNest": {
"checkPoint": "switch 语句不应嵌套",
"level": "suggestion",
"comment": "嵌套的 switch 语句使代码显得复杂,不利于维护。",
"tag": "control"
},
"ID_try_disorderedHandlers": {
"checkPoint": "catch 块序列中针对派生类的应排在前面,针对基类的应排在后面",
"level": "error",
"comment": "catch 块序列中针对派生类的应排在前面,针对基类的应排在后面,如果违反这个顺序,针对派生类的 catch 块将失去作用。",
"tag": "control",
"standard": "ISO/IEC 14882:2003 15.3,ISO/IEC 14882:2011 15.3,ISO/IEC 14882:2011 18.3",
"reference": "CWE-561,C++ Core Guidelines E.31"
},
"ID_try_disorderedEllipsis": {
"checkPoint": "catch 块序列中 catch-all 块(ellipsis handler)应位于最后",
"level": "error",
"comment": "catch 块序列中 catch-all 块(ellipsis handler)应位于最后,否则其后的 catch 块将失去作用。",
"tag": "control",
"standard": "ISO/IEC 14882:2003 15.3(6),ISO/IEC 14882:2011 15.3(5),ISO/IEC 14882:2011 18.3(5)",
"reference": "CWE-561,C++ Core Guidelines E.31,MISRA C++ 2008 15-3-7"
},
"ID_try_forbidNest": {
"checkPoint": "try 块不应嵌套",
"level": "suggestion",
"comment": "嵌套的 try-catch 使代码显得复杂,不利于维护。",
"tag": "control",
"reference": "C++ Core Guidelines E.17"
},
"ID_catch_value": {
"checkPoint": "通过引用捕获异常",
"level": "warning",
"comment": "如果按传值的方式捕获异常会造成不必要的复制开销,也可能产生对象切片问题;如果通过指针捕获异常,会增加不必要的内存管理开销,通过引用捕获异常才是合理的方式。",
"tag": "control",
"related": "ID_catch_slicing,ID_throwPointer",
"reference": "C++ Core Guidelines E.15,C++ Core Guidelines ES.63,MISRA C++ 2008 15-3-5"
},
"ID_catch_slicing": {
"checkPoint": "捕获异常时不应产生对象切片问题",
"level": "warning",
"comment": "如果catch块的参数是多态类的对象,则会产生对象切片问题,造成对异常的错误处理,故参数应改为对象的引用。",
"tag": "control",
"related": "ID_catch_value,ID_objectSlicing",
"reference": "C++ Core Guidelines C.145,C++ Core Guidelines ES.63"
},
"ID_catch_generic": {
"checkPoint": "不应捕获过于宽泛的异常",
"level": "warning",
"comment": "捕获过于宽泛的异常如 std::exception、std::logic_error、std::runtime_error 等,使异常处理失去针对性,无法做到具体问题具体处理,而且很可能将本不应处理的异常一并捕获,造成混乱。",
"tag": "control",
"related": "ID_throwGenericException",
"reference": "CWE-396"
},
"ID_catch_nonExceptionType": {
"checkPoint": "不应捕获非异常类型",
"level": "warning",
"comment": "字符串或变量以及非异常相关的对象不应被当作异常捕获,否则意味着异常相关的设计是不健全的。",
"tag": "control",
"related": "ID_throwNonExceptionType",
"reference": "C++ Core Guidelines E.14"
},
"ID_catch_justRethrow": {
"checkPoint": "捕获异常后不应直接重新抛出异常,需对异常进行有效处理",
"level": "warning",
"comment": "捕获异常后将其直接重新抛出是没有意义的,还会造成不必要的开销。",
"tag": "control"
},
"ID_missingDestructor": {
"checkPoint": "存在拷贝构造函数或赋值运算符时,不应缺少析构函数",
"level": "warning",
"comment": "存在拷贝构造函数或赋值运算符时,不应缺少析构函数。",
"tag": "type",
"related": "ID_missingCopyConstructor,ID_missingCopyAssignOperator",
"reference": "C++ Core Guidelines C.21,C++ Core Guidelines C.30,C++ Core Guidelines C.33"
},
"ID_missingCopyConstructor": {
"checkPoint": "存在赋值运算符或析构函数时,不应缺少拷贝构造函数",
"level": "warning",
"comment": "存在赋值运算符或析构函数时,不应缺少拷贝构造函数。",
"tag": "type",
"related": "ID_missingDestructor,ID_missingCopyAssignOperator",
"reference": "C++ Core Guidelines C.21"
},
"ID_missingMoveConstructor": {
"checkPoint": "存在移动赋值运算符时,不应缺少移动构造函数",
"level": "warning",
"comment": "存在移动赋值运算符,不应缺少移动构造函数,详见“Rule of five”。",
"tag": "type",
"related": "ID_missingCopyConstructor",
"reference": "C++ Core Guidelines C.21"
},
"ID_missingCopyAssignOperator": {
"checkPoint": "存在拷贝构造函数或析构函数时,不应缺少拷贝赋值运算符",
"level": "warning",
"comment": "存在拷贝构造函数或析构函数时,不应缺少拷贝赋值运算符。",
"tag": "type",
"related": "ID_missingDestructor,ID_missingCopyConstructor",
"reference": "C++ Core Guidelines C.21"
},
"ID_missingMoveAssignOperator": {
"checkPoint": "存在移动构造函数时,不应缺少移动赋值运算符",
"level": "warning",
"comment": "存在移动构造函数时,不应缺少移动赋值运算符,详见“Rule of five”。",
"tag": "type",
"related": "ID_missingCopyAssignOperator",
"reference": "C++ Core Guidelines C.21"
},
"ID_missingExplicitConstructor": {
"checkPoint": "可接受一个参数的构造函数需用 explicit 关键字限定",
"level": "suggestion",
"comment": "为了避免意料之外的类型转换,可接受一个参数的构造函数应该用 explicit 关键字限定。",
"tag": "type",
"related": "ID_missingExplicitConvertor",
"reference": "C++ Core Guidelines C.46,MISRA C++ 2008 12-1-3"
},
"ID_missingExplicitConvertor": {
"checkPoint": "重载的类型转换运算符需用 explicit 关键字限定",
"level": "suggestion",
"comment": "为了避免意料之外的类型转换,重载的类型转换运算符需用 explicit 关键字限定。",
"tag": "type",
"related": "ID_missingExplicitConstructor",
"reference": "C++ Core Guidelines C.164"
},
"ID_unsuitableCopyAssignOperator": {
"checkPoint": "抽象类禁用拷贝赋值运算符",
"level": "warning",
"comment": "抽象类没有独立的对象,不应存在拷贝赋值运算符,否则赋值是不完整的。",
"tag": "type",
"reference": "MISRA C++ 2008 12-8-2,C++ Core Guidelines C.67"
},
"ID_excessiveExplicit": {
"checkPoint": "不应过度使用 explicit 关键字",
"level": "warning",
"comment": "对类的拷贝、移动以及不接受 1 个参数的构造函数一般不用 explicit 限定,否则有损代码的易用性和可扩展性。",
"tag": "type",
"reference": "C++ Core Guidelines C.46"
},
"ID_tooManyFields": {
"checkPoint": "数据成员的数量应在规定范围之内",
"level": "warning",
"comment": "类或联合体的数据成员过多意味着一个逻辑或功能单位承担了过多的职责,违反了模块化设计理念,是难以维护的。",
"config": {
"maxClassFieldsCount": "类数据成员的数量上限,超过则报出",
"maxUnionFieldsCount": "联合体数据成员的数量上限,超过则报出"
},
"tag": "type"
},
"ID_plainNumericChar": {
"checkPoint": "参与数值运算的 char 变量需显式声明 signed 或 unsigned",
"level": "warning",
"comment": "没有 signed 或 unsigned 限制的 char 类型,是否有符号由具体的编译器决定。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2003 3.9.1(1)-implementation,ISO/IEC 14882:2011 3.9.1(1)-implementation",
"reference": "MISRA C++ 2008 5-0-11,SEI CERT INT07-C"
},
"ID_plainBinaryChar": {
"checkPoint": "字节的类型应为 unsigned char",
"level": "warning",
"comment": "字节等二进制概念不应受符号位干扰,应声明为 unsigned char。",
"tag": "declaration",
"related": "ID_plainNumericChar,ID_bitwiseOperOnSigned",
"standard": "ISO/IEC 14882:2003 3.9.1(1)-implementation,ISO/IEC 14882:2011 3.9.1(1)-implementation"
},
"ID_uselessQualifier": {
"checkPoint": "枚举类型的底层类型不应为 const 或 volatile",
"level": "warning",
"comment": "将 enum 或 enum class 的底层类型(underlying type)设为 const 或 volatile 是没有意义的,会被编译器忽略,为语言用法错误。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2011 7.2(2),ISO/IEC 14882:2011 10.2(2)"
},
"ID_duplicateEnumerator": {
"checkPoint": "同类枚举项的值不应相同",
"level": "warning",
"comment": "枚举项用于标记不同的事物,名称不同但值相同的枚举项往往意味着错误。",
"tag": "type",
"reference": "C++ Core Guidelines Enum.8"
},
"ID_casualInitialization": {
"checkPoint": "合理初始化各枚举项",
"level": "suggestion",
"comment": "合理初始化各枚举项。",
"tag": "type",
"related": "ID_duplicateEnumerator",
"reference": "MISRA C 2004 9.3,MISRA C++ 2008 8-5-3"
},
"ID_forbidUnscopedEnum": {
"checkPoint": "用 enum class 取代 enum",
"level": "suggestion",
"comment": "传统C枚举没有有效的类型和作用域控制,极易造成类型混淆和名称冲突,在 C++ 语言中建议改用 enum class。",
"tag": "type",
"standard": "ISO/IEC 14882:2011 7.2(2)",
"reference": "C++ Core Guidelines Enum.3"
},
"ID_forbidUnnamedEnum": {
"checkPoint": "不应使用匿名枚举声明",
"level": "suggestion",
"comment": "匿名枚举声明相当于在当前作用域定义常量,类型不够明确,而且如果无法确定枚举类型的名称,也意味着各枚举项不应聚为一类。",
"tag": "type",
"reference": "C++ Core Guidelines Enum.6"
},
"ID_forbidNonBasicField": {
"checkPoint": "联合体内禁用非基本类型的对象",
"level": "warning",
"comment": "因为联合体成员之间共享内存地址,所以成员具有构造或析构函数时会导致混乱。",
"tag": "type",
"standard": "ISO/IEC 14882:1998 9.5(1),ISO/IEC 14882:2003 9.5(1),ISO/IEC 14882:2011 9.5(2 3 4)"
},
"ID_forbidNakedUnion": {
"checkPoint": "禁用在类之外定义的联合体",
"level": "suggestion",
"comment": "联合体各成员共享存储地址,易引发意料之外的错误。如果一定要使用联合体,需对其进行一定的封装,避免对成员的错误访问。",
"tag": "type",
"related": "ID_forbidUnion",
"reference": "C++ Core Guidelines C.181,MISRA C 2004 18.4,MISRA C 2012 19.2,MISRA C++ 2008 9-5-1"
},
"ID_forbidUnion": {
"checkPoint": "禁用联合体",
"level": "suggestion",
"comment": "联合体各成员共享存储地址,是一种对类型理念的破坏。",
"tag": "type",
"related": "ID_forbidNakedUnion",
"reference": "MISRA C 2004 18.4,MISRA C 2012 19.2,MISRA C++ 2008 9-5-1"
},
"ID_deprecatedDefaultArgument": {
"checkPoint": "不建议虚函数的参数有默认值",
"level": "suggestion",
"comment": "虚函数参数的默认值不受多态规则控制,通过基类指针或引用调用派生类重写的虚函数时,默认值仍采用基类中的定义,易造成混淆,建议虚函数参数不使用默认值。",
"tag": "declaration",
"related": "ID_inconsistentDefaultArgument",
"standard": "ISO/IEC 14882:2003 8.3.6(10),ISO/IEC 14882:2011 8.3.6(10),ISO/IEC 14882:2017 11.3.6(10)",
"reference": "CWE-628,C++ Core Guidelines C.140,MISRA C++ 2008 8-3-1"
},
"ID_inconsistentDefaultArgument": {
"checkPoint": "虚函数参数的默认值应与基类中声明的一致",
"level": "error",
"comment": "虚函数参数的默认值不受多态规则控制,通过基类指针或引用调用派生类重写的虚函数时,默认值仍采用基类中的定义。",
"tag": "declaration",
"related": "ID_deprecatedDefaultArgument",
"standard": "ISO/IEC 14882:2003 8.3.6(10),ISO/IEC 14882:2011 8.3.6(10),ISO/IEC 14882:2017 11.3.6(10)",
"reference": "CWE-628,C++ Core Guidelines C.140,MISRA C++ 2008 8-3-1"
},
"ID_complexDeclaration": {
"checkPoint": "不建议采用复杂的声明",
"level": "suggestion",
"comment": "复杂的声明可读性较差,容易造成理解上的偏差。",
"tag": "declaration"
},
"ID_staticNotUsed": {
"checkPoint": "不应存在未被使用的本地 static 函数",
"level": "warning",
"comment": "未被使用的本地 static 函数得不到任何执行机会,应删除或修正调用关系。",
"tag": "declaration",
"related": "ID_unreachableCode",
"reference": "MISRA C++ 2008 0-1-10"
},
"ID_privateNotUsed": {
"checkPoint": "不应存在未被使用的 private 成员",
"level": "warning",
"comment": "未被使用的 private 成员没有意义,应删除或修正引用关系。",
"tag": "declaration",
"related": "ID_unreachableCode",
"reference": "MISRA C++ 2008 0-1-10"
},
"ID_missingParamName": {
"checkPoint": "函数原型声明中的参数应具有合理的名称",
"level": "suggestion",
"comment": "参数的名称是其用途的直接说明,合理的名称可显著提高可读性。",
"tag": "declaration",
"reference": "MISRA C 2004 16.3,MISRA C 2012 8.2"
},
"ID_deprecatedAutoPtr": {
"checkPoint": "避免使用 std::auto_ptr",
"level": "warning",
"comment": "std::auto_ptr 在 C++11 标准中已被废弃,应使用 std::unique_ptr。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2011 D.10-deprecated",
"reference": "C++ Core Guidelines R.20"
},
"ID_mixedDeclarations": {
"checkPoint": "不应将函数或函数指针和其他声明写在同一个语句中",
"level": "suggestion",
"comment": "每条语句只应声明一个函数或函数指针,否则可读性较差。",
"tag": "declaration",
"related": "ID_tooManyDeclarators",
"reference": "C++ Core Guidelines ES.10"
},
"ID_mixedTypeObjDefinition": {
"checkPoint": "不建议将类型定义和对象声明写在一个语句中",
"level": "suggestion",
"comment": "将类型定义和对象声明写在一个语句中可读性较差。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.7"
},
"ID_tooManyDeclarators": {
"checkPoint": "在一个语句中不应声明过多对象或函数",
"level": "suggestion",
"comment": "在一个语句中不应声明过多对象或函数,建议在每个语句中只声明一个对象或函数,提高可读性也可减少笔误。",
"config": {
"maxDeclaratorCount": "一个声明语句能包含的对象个数上限,超过则报出"
},
"tag": "declaration",
"reference": "C++ Core Guidelines ES.10,MISRA C++ 2008 8-0-1"
},
"ID_sandwichedModifier": {
"checkPoint": "const、volatile 等关键字不应出现在基本类型名称的中间",
"level": "suggestion",
"comment": "某些基本类型可由多个符号组成,const 或 volatile 等关键字不应出现在这些符号的中间,否则可读性较差。",
"tag": "declaration",
"related": "ID_badQualifierPosition,ID_badSpecifierPosition",
"reference": "C++ Core Guidelines NL.26"
},
"ID_badQualifierPosition": {
"checkPoint": "const、volatile 限定类型时应出现在左侧",
"level": "suggestion",
"comment": "语言允许 const、volatile 出现在类型名的左侧,也可以出现在其右侧,甚至可以出现在基本类型名的中间,为了提高可读性,应对其位置进行统一规范。",
"tag": "declaration",
"related": "ID_sandwichedModifier,ID_badSpecifierPosition",
"reference": "C++ Core Guidelines NL.26"
},
"ID_badSpecifierPosition": {
"checkPoint": "inline、virtual、static、typedef 等关键字应出现在类型名的左侧",
"level": "suggestion",
"comment": "语言允许 inline、virtual、static、typedef 等关键字可以出现在类型名的左侧,也可以出现在其右侧,甚至可以出现在基本类型名的中间,为了提高可读性,应对其位置进行统一规范。",
"tag": "declaration",
"related": "ID_sandwichedModifier,ID_badQualifierPosition"
},
"ID_hideLocal": {
"checkPoint": "局部名称不应被覆盖",
"level": "warning",
"comment": "嵌套的作用域中不应出现相同的名称,否则干扰阅读,极易产生误解。",
"tag": "declaration",
"reference": "CWE-1109,C++ Core Guidelines ES.12,MISRA C 2004 5.2,MISRA C 2012 5.3,MISRA C++ 2008 2-10-2"
},
"ID_hideMember": {
"checkPoint": "成员名称不应被覆盖",
"level": "warning",
"comment": "如果成员函数内的局部名称与成员名称相同,会干扰阅读,易产生误解。",
"tag": "declaration",
"reference": "CWE-1109,MISRA C 2004 5.2,MISRA C 2012 5.3,MISRA C++ 2008 2-10-2"
},
"ID_missingConst": {
"checkPoint": "避免用常量字符串对非常量字符串指针赋值",
"level": "warning",
"comment": "用常量字符串对非常量字符串指针赋值,相关内存被修改会导致标准未定义的问题。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2003 2.13.4(2)-undefined,ISO/IEC 14882:2011 2.14.5(12)-undefined,ISO/IEC 14882:2011 5.13.5(16)-undefined",
"reference": "MISRA C 2012 7.4"
},
"ID_virtualComparison": {
"checkPoint": "比较运算符不应为虚函数",
"level": "warning",
"comment": "重载的比较运算符很难正确触发 C++ 的多态机制,将其设为虚函数很可能引发意料之外的错误。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.87"
},
"ID_virtualAssignment": {
"checkPoint": "拷贝赋值、移动赋值运算符不应为虚函数",
"level": "warning",
"comment": "拷贝或移动赋值运算符的返回类型应为所属类的非 const 引用,这类运算符即使是虚函数也不便于被重写。",
"tag": "declaration",
"related": "ID_nonStdAssignmentRetType",
"reference": "C++ Core Guidelines C.60,C++ Core Guidelines C.63"
},
"ID_nonStdCopyAssignmentParam": {
"checkPoint": "拷贝赋值运算符的参数应为同类对象的 const 左值引用",
"level": "warning",
"comment": "拷贝赋值运算符的参数不应按值传递,否则会造成不必要的复制,以及“对象切片”等问题。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.60"
},
"ID_nonStdMoveAssignmentParam": {
"checkPoint": "移动赋值运算符的参数应为同类对象的非 const 右值引用",
"level": "warning",
"comment": "移动赋值运算符的参数不可为 const 右值引用,否则将失去移动赋值的意义。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.63"
},
"ID_nonStdAssignmentRetType": {
"checkPoint": "拷贝赋值、移动赋值运算符应返回所属类的非 const 引用",
"level": "warning",
"comment": "拷贝赋值、移动赋值运算符应返回所属类的非 const 引用,便于调用者使用并满足泛型编程的要求。",
"tag": "declaration",
"reference": "C++ Core Guidelines F.47,C++ Core Guidelines C.60,C++ Core Guidelines C.63"
},
"ID_mainReturnsNonInt": {
"checkPoint": "main 函数的返回类型只应为 int",
"level": "warning",
"comment": "main 函数的返回值可作为整个进程执行情况的总结,按惯例返回 0 或 EXIT_SUCCESS 表示执行成功,非 0 或 EXIT_FAILURE 表示执行失败,main 函数的返回值会作为标准 exit 函数的参数。",
"tag": "function",
"standard": "ISO/IEC 9899:2011 5.1.2.2.1(1),ISO/IEC 9899:2011 5.1.2.2.3(1)",
"reference": "C++ Core Guidelines F.46"
},
"ID_missingNamespace": {
"checkPoint": "为代码设定合理的命名空间",
"level": "warning",
"comment": "命名空间是 C++ 项目的必要组成结构,可有效规避名称冲突等问题。",
"tag": "global",
"related": "ID_usingNamespaceInHeader,ID_forbidUsingDirectives",
"reference": "MISRA C++ 2008 7-3-1"
},
"ID_nonGlobalMain": {
"checkPoint": "main 函数只应处于全局作用域中",
"level": "warning",
"comment": "main 函数作为程序的入口,链接器需对其特殊处理,不应受命名空间等作用域的限制。",
"tag": "global",
"reference": "MISRA C++ 2008 7-3-2"
},
"ID_illFormedMain": {
"checkPoint": "main 函数不应被重载,也不应声明为 inline、static 或 constexpr",
"level": "warning",
"comment": "main 函数作为程序的入口,链接器需对其特殊处理,标准规定 main 函数不应被重载,也不应声明为 inline、static 或 constexpr。",
"tag": "function",
"standard": "ISO/IEC 14882:2003 3.6.1(2 3),ISO/IEC 14882:2011 3.6.1(2 3),ISO/IEC 14882:2017 6.6.1(2 3)"
},
"ID_constLiteralReference": {
"checkPoint": "对常量的定义不应为引用",
"level": "warning",
"comment": "虽然 C++ 语言十分灵活,可以通过多种方式达到同一种目的,但应该选择最简洁且通俗易懂的方式实现。",
"tag": "declaration"
},
"ID_forbidEnumBitfield": {
"checkPoint": "不应对枚举变量声明位域",
"level": "warning",
"comment": "枚举变量的类型可以是有符号整数,符号位与位域结合易导致意料之外的错误,且不利于枚举类型的扩展。",
"tag": "declaration",
"related": "ID_singleSignedBitfield",
"reference": "MISRA C++ 2008 9-6-3"
},
"ID_forbidFlexibleArray": {
"checkPoint": "禁用柔性数组",
"level": "suggestion",
"comment": "柔性数组(flexible array)一般是指结构体最后不完整定义的数组成员,表示不占用空间的指针,这种数组在 C99 中有所定义,但不在 C++ 标准之中,在 C++ 代码中不应使用。",
"tag": "declaration",
"standard": "ISO/IEC 9899:1999 6.7.2.1(16)",
"reference": "MISRA C 2012 18.7"
},
"ID_unsuitableArraySize": {
"checkPoint": "局部数组的长度不应过大",
"level": "warning",
"comment": "局部数组的长度过大增加函数堆栈的压力,易导致溢出错误。",
"config": {
"maxLocalArraySize": "局部数组的长度上限,超过则报出"
},
"tag": "declaration",
"reference": "CWE-770,SEI CERT MEM05-C"
},
"ID_exceededBitfield": {
"checkPoint": "位域长度不应超过类型约定的大小",
"level": "warning",
"comment": "位域长度不应超过类型约定的大小,否则没有意义且会造成不必要的空间浪费。",
"tag": "declaration",
"standard": "ISO/IEC 9899:2011 6.7.2.1(4),ISO/IEC 14882:2011 9.6(1)"
},
"ID_singleSignedBitfield": {
"checkPoint": "有符号变量的位域长度不应为 1",
"level": "warning",
"comment": "有符号变量的位域长度如果为 1 表示只有一个比特位,而该比特位是符号位,极易造成意料之外的错误。",
"tag": "declaration",
"reference": "MISRA C++ 2008 9-6-4"
},
"ID_invalidFinal": {
"checkPoint": "不应将 union 设为 final",
"level": "warning",
"comment": "标准规定 union 不可作为基类,所以将 union 声明为 final 是没有意义的,属于语言运用错误。",
"standard": "ISO/IEC 9899:2011 9.5(2)",
"tag": "declaration"
},
"ID_virtualInFinal": {
"checkPoint": "final 类中不应声明虚函数",
"level": "warning",
"comment": "final 类不再产生派生类,其中的虚函数也不会再被重写,故不应声明虚函数。",
"standard": "ISO/IEC 9899:2011 9(3)",
"tag": "declaration"
},
"ID_exceptionUnsafe": {
"checkPoint": "确保异常的安全性",
"level": "warning",
"comment": "确保异常的安全性。",
"tag": "exception",
"related": "ID_resourceLeak,ID_ownerlessResource,ID_throwInSwap",
"reference": "Effective C++ item 29"
},
"ID_exceptionInException": {
"checkPoint": "异常类的构造函数与异常信息相关的函数不应抛出异常",
"level": "warning",
"comment": "抛出异常时,或获取异常相关的信息时,如果再抛出异常不利于异常的处理与定位。",
"tag": "exception",
"standard": "ISO/IEC 14882:2011 18.8.1"
},
"ID_forbidThrowSpecification": {
"checkPoint": "禁用含 throw 关键字的异常规格说明",
"level": "warning",
"comment": "由 throw 关键字声明的动态异常规格说明已过时,应采用由 noexcept 关键字声明的方式。",
"config": {
"forbidEmptyThrowSpecification": "为 true 时报出空 throw 异常规格说明,否则放过"
},
"tag": "exception",
"standard": "ISO/IEC 14882:2011 D.4-deprecated,ISO/IEC 14882:2017 D.3-deprecated",
"reference": "C++ Core Guidelines E.12,C++ Core Guidelines E.30"
},
"ID_forbidVariadicFunction": {
"checkPoint": "禁用可变参数列表",
"level": "warning",
"comment": "可变参数列表对参数的类型和数量缺乏有效的限定和控制,是公认的不安全因素。",
"tag": "declaration",
"reference": "C++ Core Guidelines ES.34,C++ Core Guidelines F.55,MISRA C 2004 16.1,MISRA C++ 2008 8-4-1"
},
"ID_redundantVirtual": {
"checkPoint": "有 override 或 final 关键字时,不应再出现 virtual 关键字",
"level": "suggestion",
"comment": "只应在定义新的虚函数时使用 virtual 关键字,当重写虚函数时,应使用 override 或 final 关键字,不应再出现 virtual 关键字,使代码更清晰简洁。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.128"
},
"ID_redundantOverride": {
"checkPoint": "override 和 final 关键字不应同时出现",
"level": "suggestion",
"comment": "final 表示不可重写的重写,override 表示可再次重写的重写,这两个关键字不应同时出现。",
"tag": "declaration",
"reference": "C++ Core Guidelines C.128"
},
"ID_forbidBitfield": {
"checkPoint": "禁用位域",
"level": "suggestion",
"comment": "引入位域的本意是为了节省空间,然而位域改变了变量约定俗成的取值范围,易造成理解上的偏差,也会造成维护困难。",
"tag": "declaration",
"standard": "ISO/IEC 14882:2003 9.6(1)-implementation,ISO/IEC 14882:2003 9.6(3),ISO/IEC 14882:2011 9.6(1)-implementation,ISO/IEC 14882:2011 9.6(3),ISO/IEC 14882:2017 12.2.4(1)-implementation,ISO/IEC 14882:2017 12.2.4(3)",
"related": "ID_exceededBitfield,ID_singleSignedBitfield,ID_forbidEnumBitfield"
},
"ID_labelNotUsed": {
"checkPoint": "不应存在没有用到的标签",
"level": "warning",
"comment": "没有用到的标签意味着 goto 语句的缺失,也可能是残留代码,应当去除。",
"tag": "declaration",
"reference": "MISRA C 2012 2.6"
},
"ID_forbidRestrictPtr": {
"checkPoint": "禁用 restrict 指针",
"level": "warning",
"comment": "C 语言中的 restrict 指针要求其他指针不能再指向相同区域,有助于编译器优化,但不符合这种限制时会导致标准未定义的错误,相当于增加了误用的风险,也提高了测试成本。",
"tag": "declaration",
"standard": "ISO/IEC 9899:1999 6.7.3.1(4 9 11)-undefined,ISO/IEC 9899:2011 6.7.3.1(4 9 11)-undefined",
"reference": "MISRA C 2012 8.14,SEI CERT EXP43-C"
},
"ID_forbidStaticArrSize": {
"checkPoint": "声明数组参数的大小时禁用 static 关键字",
"level": "warning",
"comment": "C 语言规定数组作为形式参数时,可用 static 关键字修饰大小,要求传入数组的大小不能小于由 static 关键字修饰的值,有助于编译器优化,但不符合这种限制时会导致标准未定义错误,相当于增加了误用的风险,也提高了测试成本。",
"tag": "declaration",
"standard": "ISO/IEC 9899:1999 6.7.6.3(7),ISO/IEC 9899:2011 6.7.6.3(7)",
"reference": "MISRA C 2012 17.6"
},
"ID_forbidGotoBlocks": {