编译器错误的单元测试

Lir*_*una 7 c++ error-handling unit-testing

如何在单元测试中测试想要引发的编译器错误?

考虑一下代码:

class ErrorTest
{
    OtherClass& read_write() {
        return other;
    }

    const OtherClass& read_only() const {
        return other;
    }

    private:
        OtherClass other;
};
Run Code Online (Sandbox Code Playgroud)

如何测试read_only()赋值?这非常重要,应该坚定地检查以正确生成编译器错误:

ErrorTest test;
OtherClass other = test.read_only();
test.read_write() = other.modify();
test.read_only() = other.modify(); /* This should error */
Run Code Online (Sandbox Code Playgroud)

Chr*_*uin 1

我想现在的主要问题是,您现在正在测试您的代码还是编译器?

测试编译器不一定是坏事...我过去曾遇到过编译器升级掩码错误,因此最好确保您获得与您期望的相同的安全检查集。

然而,你必须做很多跑腿的工作。您的单元测试必须生成编译器,捕获其输出,并解析它以在正确的行上找到正确的错误语句。这并非微不足道,而且可以说不值得。

一种稍微简单的方法可能是保留一个包含错误代码的目录,并让脚本一次编译每个文件。那里有一个“#ifdef MAKEFAIL”标志,可以打开应该失败的确切条件。确保编译器在未设置该标志时返回 0,在设置时返回非零。假设编译器在失败时返回非零...我不知道 MSVC 是否遵循该规则。

为了解决可移植性问题,我将抛出的第三个选项是 autoconf。设置起来可能很痛苦,但其部分目的是确保您在编译之前拥有一个健全的开发环境。您可以在其中添加这样的测试,它可以处理查找编译器并尝试它。

  • 他正在测试他的代码是否常量正确。所以我认为他仍在测试他的代码,只是他正在测试它的属性,这些属性仅在编译时才明显。 (6认同)
  • @Chris:他试图捕获程序员忘记将 read_only 的返回值标记为 const 的错误。因此,如果代码读取“OtherClass &read_only()”而不是“const OtherClass &read_only() const”,那么测试代码将编译而不是给出错误,并且他希望测试失败。我认为。 (2认同)