测试仅在 travis-ci 上失败;不支持 RTTI?
Test failing only on travis-ci; RTTI not supported?
我有一个相当简单的测试,它在 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)
是 returning null
而我期待它
到 return 一些非空值。我们可以明显地看到 b
实际上是一个 Derived
实例——我是不是在我的各种强制转换和取消引用中做错了什么?
我将此作为对问题的评论发布,但认为它应该在答案部分。事实证明我有多个编译单元 类 称为 Base
和 Derived
并且在链接时它引起了冲突。更改 类 的名称解决了问题。
我有一个相当简单的测试,它在 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)
是 returning null
而我期待它
到 return 一些非空值。我们可以明显地看到 b
实际上是一个 Derived
实例——我是不是在我的各种强制转换和取消引用中做错了什么?
我将此作为对问题的评论发布,但认为它应该在答案部分。事实证明我有多个编译单元 类 称为 Base
和 Derived
并且在链接时它引起了冲突。更改 类 的名称解决了问题。