misc-throw-by-value-catch-by-reference¶
cert-err09-cpp 和 cert-err61-cpp 作为此检查的别名重定向到这里。
查找“按值抛出,按引用捕获”规则的违规情况,例如在 H. Sutter 和 A. Alexandrescu 的“C++ 编码标准”中以及 CERT C++ 编码标准规则 ERR61-CPP。按左值引用捕获异常 中介绍的规则。
- 异常
尽管是指针,但抛出字符串字面量不会被标记。它们不易受切片的影响,使用字符串字面量是惯用的。
捕获字符指针(
char
、wchar_t
、unicode 字符类型)不会被标记,以允许捕获字符串字面量。移动的命名值不会被标记为没有抛出匿名临时变量。在这种情况下,我们可以确定用户知道该对象无法在处理错误的 catch 块之外访问。
抛出函数参数不会被标记为没有抛出匿名临时变量。这允许用于抛出的辅助函数。
重新抛出捕获的异常变量不会被标记为没有抛出匿名临时变量。虽然这通常可以通过简单地编写
throw;
来完成,但这在实际代码中经常发生。
选项¶
- CheckThrowTemporaries¶
触发对 CERT 建议 ERR09-CPP 的违规行为的检测。抛出匿名临时变量。默认值为 true。
- WarnOnLargeObject¶
还会警告按值捕获的任何大型平凡对象。按值捕获大型对象并不危险,但会对性能产生负面影响。可以使用 MaxSize 选项设置允许在没有警告的情况下捕获的对象的最大大小。默认值为 false。
- MaxSize¶
确定允许在没有警告的情况下捕获的对象的最大大小。仅当
WarnOnLargeObject
设置为 true 时才适用。如果用户将选项设置为 std::numeric_limits<uint64_t>::max(),则它将恢复为默认值。默认值为 size_t 的大小。