misc-throw-by-value-catch-by-reference

cert-err09-cppcert-err61-cpp 作为此检查的别名重定向到这里。

查找“按值抛出,按引用捕获”规则的违规情况,例如在 H. Sutter 和 A. Alexandrescu 的“C++ 编码标准”中以及 CERT C++ 编码标准规则 ERR61-CPP。按左值引用捕获异常 中介绍的规则。

异常
  • 尽管是指针,但抛出字符串字面量不会被标记。它们不易受切片的影响,使用字符串字面量是惯用的。

  • 捕获字符指针(charwchar_t、unicode 字符类型)不会被标记,以允许捕获字符串字面量。

  • 移动的命名值不会被标记为没有抛出匿名临时变量。在这种情况下,我们可以确定用户知道该对象无法在处理错误的 catch 块之外访问。

  • 抛出函数参数不会被标记为没有抛出匿名临时变量。这允许用于抛出的辅助函数。

  • 重新抛出捕获的异常变量不会被标记为没有抛出匿名临时变量。虽然这通常可以通过简单地编写 throw; 来完成,但这在实际代码中经常发生。

选项

CheckThrowTemporaries

触发对 CERT 建议 ERR09-CPP 的违规行为的检测。抛出匿名临时变量。默认值为 true

WarnOnLargeObject

还会警告按值捕获的任何大型平凡对象。按值捕获大型对象并不危险,但会对性能产生负面影响。可以使用 MaxSize 选项设置允许在没有警告的情况下捕获的对象的最大大小。默认值为 false

MaxSize

确定允许在没有警告的情况下捕获的对象的最大大小。仅当 WarnOnLargeObject 设置为 true 时才适用。如果用户将选项设置为 std::numeric_limits<uint64_t>::max(),则它将恢复为默认值。默认值为 size_t 的大小。