在mingw中编译段错误,但在linux上不是gcc。
问题描述:
我试图建立谷歌的液体乐趣图书馆,但在使用mingw的窗户上我得到了一个seg故障,我有点难住。编译失败的方法在mingw中编译段错误,但在linux上不是gcc。
void b2ParticleSystem::CreateParticlesStrokeShapeForGroup(
const b2Shape *shape,
const b2ParticleGroupDef& groupDef, const b2Transform& xf)
{
float32 stride = groupDef.stride;
if (stride == 0)
{
stride = GetParticleStride();
}
float32 positionOnEdge = 0;
int32 childCount = shape->GetChildCount();
for (int32 childIndex = 0; childIndex < childCount; childIndex++)
{
b2EdgeShape edge;
if (shape->GetType() == b2Shape::e_edge)
{
edge = *(b2EdgeShape*) shape;
}
else
{
b2Assert(shape->GetType() == b2Shape::e_chain);
((b2ChainShape*) shape)->GetChildEdge(&edge, childIndex);
}
b2Vec2 d = edge.m_vertex2 - edge.m_vertex1;
float32 edgeLength = d.Length();
while (positionOnEdge < edgeLength)
{
b2Vec2 p = edge.m_vertex1 + positionOnEdge/edgeLength * d;
CreateParticleForGroup(groupDef, xf, p);
positionOnEdge += stride;
}
positionOnEdge -= edgeLength;
}
}
postionOnEdge + = stride;如果我发表评论说它会成功编译,那么会导致问题,但显然会在运行时创建无限循环。对于为什么它只会在明行中导致seg故障,甚至将行更改为positionOnEdge + = 0.0f,我都有点想法。导致它出现段错误。
答
恭喜您:您在编译器中发现了一个错误。无论您的源代码包含什么,编译器都不应该与segfault本身崩溃。
除了正式报告这个bug之外,几乎没有什么可以做的。你可以试着弄清究竟是什么让编译器脱离轨道,试图绕过bug,但这最好是一个猜测游戏。
你声称你隔绝编译崩盘:
positionOnEdge += stride;
尝试改变代码,以某种形式或时尚。也许“positionOnEdge = positionOnEdge + stride;”对编译器来说是可口的。也许用一个函数调用一些外部函数替代它,通过引用传递这两个变量,并在一些外部函数中执行加法,就可以实现。
而且,当然,您可以随时检查是否有最新版本的编译器。如果没有,升级,并希望你的编译器的当前版本已经修复了这个bug。
编译期间的任何崩溃都是一个编译器错误。如果您将调用上方的'positionOnEdge + = stride'行移至'CreateParticleForGroup',会发生什么情况? – 1201ProgramAlarm
感谢这个想法,不幸的是将它移动出来导致同样的问题。我认为这很可能是一个编译器bug,因为它在linux上可以正常工作。但我希望有人可以有一些工作。对我来说,看起来很奇怪,只有那条线导致了一个问题,因为这是一个基本的操作。 – Ben
只是为了好奇;将该行更改为'b2Vec2 p = edge.m_vertex1 +(positionOnEdge * d)/ edgeLength;' – Loreto