451
451
- [R9.7.2 禁止 goto 语句向前跳转](#forbidgotoback)
452
452
- [R9.7.3 禁用 goto 语句](#forbidgoto)
453
453
- [R9.7.4 禁用 setjmp、longjmp](#forbidlongjmp)
454
- - [R9.7.5 不应出现多余的跳转语句 ](#redundantjump)
454
+ - [R9.7.5 不应存在不受条件控制的跳转语句 ](#redundantjump)
455
455
- [R9.7.6 避免使用跳转语句退出循环](#jumpoutloop)
456
456
<br/>
457
457
@@ -1119,7 +1119,7 @@ gets、strcpy、strcat、wcscpy、wcscat、
1119
1119
sprintf、vsprintf、swprintf、vswprintf、
1120
1120
scanf、sscanf、fscanf、vfscanf、vscanf、vsscanf
1121
1121
```
1122
- 与这类函数相似的 API 同样受本规则约束,如 :
1122
+ 与这类函数相似的函数同样受本规则约束,如下列 Windows API :
1123
1123
```
1124
1124
StrCpy、StrCpyA、StrCpyW、StrCat、StrCatA、StrCatW、
1125
1125
lstrcpy、lstrcpyA、lstrcpyW、lstrcat、lstrcatA、lstrcatW
@@ -10611,7 +10611,7 @@ ID_illForwardingReference     :fire: function warning
10611
10611
10612
10612
<hr/>
10613
10613
10614
- 不应混淆转发引用与右值引用 ,除作为 std::forward 的参数之外,不应对转发引用再有任何操作。
10614
+ 不应混淆“[转发引用(forwarding references)](https://en.cppreference.com/w/cpp/language/reference#Forwarding_references)”与右值引用 ,除作为 std::forward 的参数之外,不应对转发引用再有任何操作。
10615
10615
10616
10616
转发引用是类型为 T&& 的参数,T 为函数模板类型,无论左值还是右值均可被这种参数接受,而且 const、volatile 等属性也会被忽略,由于含有不确定的状态,所以直接操作转发引用是不妥的,只应通过 std::forward<T> 交由合适的接口处理。
10617
10617
@@ -10630,6 +10630,11 @@ void bar(T&& x) {
10630
10630
ID_unsuitableForward
10631
10631
<br/>
10632
10632
10633
+ #### 依据
10634
+ ISO/IEC 14882:2011 20.2.3(1)
10635
+ ISO/IEC 14882:2017 23.2.5(1)
10636
+ <br/>
10637
+
10633
10638
#### 参考
10634
10639
C++ Core Guidelines F.19
10635
10640
<br/>
@@ -14596,32 +14601,33 @@ MISRA C++ 2008 17-0-5
14596
14601
<br/>
14597
14602
<br/>
14598
14603
14599
- ### <span id="redundantjump">▌R9.7.5 不应出现多余的跳转语句 </span>
14604
+ ### <span id="redundantjump">▌R9.7.5 不应存在不受条件控制的跳转语句 </span>
14600
14605
14601
14606
ID_redundantJump     :fire: control warning
14602
14607
14603
14608
<hr/>
14604
14609
14605
- 无返回值函数的最后一条 return 语句、循环体的最后一条 continue 语句、goto 到下一条语句等是多余的,应当去除 。
14610
+ 不受条件控制的跳转语句不改变程序的执行路径,往往意味着逻辑错误或功能未实现 。
14606
14611
14607
14612
示例:
14608
14613
```
14609
14614
void foo() {
14615
+ goto L; // Non-compliant, unconditional
14616
+ .... // Dead code
14617
+ L:
14610
14618
....
14611
- return; // Redundant
14612
14619
}
14613
14620
14614
14621
void bar() {
14615
- while (condition) {
14616
- ....
14617
- continue; // Redundant
14618
- }
14622
+ ....
14623
+ return; // Non-compliant, redundant
14619
14624
}
14620
14625
14621
14626
void baz() {
14622
- goto L; // Redundant
14623
- L:
14624
- ....
14627
+ while (cond) {
14628
+ ....
14629
+ continue; // Non-compliant, redundant
14630
+ }
14625
14631
}
14626
14632
```
14627
14633
<br/>
0 commit comments