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

标签 c++ inheritance travis-ci undefined-behavior dynamic-cast

我有一个相当简单的测试,它在 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 的类,并且在链接时会导致冲突。更改类的名称解决了这个问题。

关于c++ - 仅在 travis-ci 上测试失败;不支持 RTTI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31693113/

相关文章:

c++ - 英特尔 C++ 编译器 : What is highest GCC version compatibility?

c++ - 优化光线追踪器中的 BVH 遍历

c++ - 根据模板参数不同的基类

gradle - 如何修复Tavis构建中的权限被拒绝问题

C++ 用代码调用func和直接调用代码在性能上有什么区别吗? (来自 python )

JavaScript 继承和 super 构造函数

c++ - 正确的 C++ 方法来存储多类型数据

python - Travis 脚本退出代码永远不会失败,即使应该失败

github - Travis CI 可以在同一个 repo 的不同分支中使用加密文件吗?

c++11 decltype 返回引用类型