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

C++ 仅在travis ci上测试失败;不支持RTTI?,c++,inheritance,travis-ci,undefined-behavior,dynamic-cast,C++,Inheritance,Travis Ci,Undefined Behavior,Dynamic Cast,我有一个相当简单的测试,在travis ci continuous integration服务器上失败,但我无法重现失败。似乎CI服务器上不支持RTTI,但据我所知,在gcc上关闭RTTI是不可能的 我想知道我是否依赖于未定义的行为,这就是造成差异的原因。有谁能告诉我为什么这可能会失败 #包括 模板 T*As(U*对象) { 返回动态_cast(对象); } 阶级基础 { 公众: Base(){} 虚拟~Base(){} }; 派生类:公共基 {}; { //在测试中。。。 衍生b; 要求(As

我有一个相当简单的测试,在travis ci continuous integration服务器上失败,但我无法重现失败。似乎CI服务器上不支持RTTI,但据我所知,在gcc上关闭RTTI是不可能的

我想知道我是否依赖于未定义的行为,这就是造成差异的原因。有谁能告诉我为什么这可能会失败

#包括
模板
T*As(U*对象)
{
返回动态_cast(对象);
}
阶级基础
{
公众:
Base(){}
虚拟~Base(){}
};
派生类:公共基
{};
{
//在测试中。。。
衍生b;
要求(As((基本*)&b)==&b);
}
当我在各种架构上运行时,上述测试总是通过,但在travis ci上失败,扩展如下:

__null == 0x00007ffd6d95fe70
因此,
As((Base*)&b)
正在返回
null
,而我希望返回它
返回一些非空值。显然,我们可以看到
b
实际上是一个
派生的
实例-我的各种类型转换和取消引用是否有问题?

我将此作为对问题的评论发布,但我认为它应该在答案部分。事实证明,我有多个编译单元,其中的类名为
Base
Derived
,链接时会导致冲突。更改类的名称解决了这个问题。

我将此作为对问题的评论发布,但我认为应该在答案部分。事实证明,我有多个编译单元,其中的类名为
Base
Derived
,链接时会导致冲突。更改类的名称解决了这个问题。

您是否检查过是否使用与Travis相同的gcc版本?如果不是,那么您在机器上观察到不同的行为也就不足为奇了……而且,您的示例代码甚至不应该编译
As(…)
接收并返回一个引用,但您使用指针调用它,并将结果与指针进行比较……用ideone在不同的gcc版本上尝试您的示例,看看它告诉您什么?是否所有版本都出现了问题?如果是的话,你能在单独的回购协议中孤立这个问题,看看特拉维斯的人在说什么吗?也许你的Travis yaml文件向gcc传递了一个意外的标志?@iondune——将其作为答案发布,我将对此进行投票:)你检查过你使用的gcc版本是否与Travis相同吗?如果不是,那么您在机器上观察到不同的行为也就不足为奇了……而且,您的示例代码甚至不应该编译
As(…)
接收并返回一个引用,但您使用指针调用它,并将结果与指针进行比较……用ideone在不同的gcc版本上尝试您的示例,看看它告诉您什么?是否所有版本都出现了问题?如果是的话,你能在单独的回购协议中孤立这个问题,看看特拉维斯的人在说什么吗?也许你的Travis yaml文件正在向gcc传递一个意外的标志?@iondune——将此作为答案发布,我将向上投票:)