测试仅在travis-ci上失败;不支持RTTI

Test failing only on travis-ci; RTTI not supported?

本文关键字:不支持 RTTI 失败 travis-ci 测试      更新时间:2023-10-16

我有一个相当简单的测试,在travis-ci持续集成服务器上失败了,但我无法重现失败。看起来好像CI服务器上不支持RTTI,但据我所知,在gcc上关闭RTTI是不可能的。

我想知道我是否依赖于这里的未定义行为,这就是导致差异的原因。谁能告诉我为什么这可能会失败不一致?

#include <catch.hpp>
template <typename T, typename U>
T * As(U * Object)
{
    return dynamic_cast<T *>(Object);
}
class Base
{
public:
    Base() {}
    virtual ~Base() {}
};
class Derived : public Base
{};

{
    // in tests...
    Derived b;
    REQUIRE(As<Derived>((Base*)&b) == &b);
}

当我在各种体系结构上运行时,上面的测试总是通过的,但是通过以下扩展在travis-ci上失败:

__null == 0x00007ffd6d95fe70

所以As<Derived>((Base*)&b)在我期望的时候返回null返回一些非空值。我们可以明显地看到,b实际上是一个Derived实例-我做错了什么我的各种类型转换和取消引用?

我把这个作为对这个问题的评论,但我认为它应该在答案部分。事实证明,我有多个编译单元,类称为BaseDerived,当链接它引起冲突。修改类名解决了这个问题。