在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,我都有点想法。导致它出现段错误。

+0

编译期间的任何崩溃都是一个编译器错误。如果您将调用上方的'positionOnEdge + = stride'行移至'CreateParticleForGroup',会发生什么情况? – 1201ProgramAlarm

+0

感谢这个想法,不幸的是将它移动出来导致同样的问题。我认为这很可能是一个编译器bug,因为它在linux上可以正常工作。但我希望有人可以有一些工作。对我来说,看起来很奇怪,只有那条线导致了一个问题,因为这是一个基本的操作。 – Ben

+0

只是为了好奇;将该行更改为'b2Vec2 p = edge.m_vertex1 +(positionOnEdge * d)/ edgeLength;' – Loreto

恭喜您:您在编译器中发现了一个错误。无论您的源代码包含什么,编译器都不应该与segfault本身崩溃。

除了正式报告这个bug之外,几乎没有什么可以做的。你可以试着弄清究竟是什么让编译器脱离轨道,试图绕过bug,但这最好是一个猜测游戏。

你声称你隔绝编译崩盘:

positionOnEdge += stride; 

尝试改变代码,以某种形式或时尚。也许“positionOnEdge = positionOnEdge + stride;”对编译器来说是可口的。也许用一个函数调用一些外部函数替代它,通过引用传递这两个变量,并在一些外部函数中执行加法,就可以实现。

而且,当然,您可以随时检查是否有最新版本的编译器。如果没有,升级,并希望你的编译器的当前版本已经修复了这个bug。

+0

我试过对positionOnEdge = positionOnEdge + stride进行更改;但那并没有改变任何东西。我会尝试外部功能的想法,这是一个很好的想法。 – Ben

+0

不幸的是,外部函数尝试仍然无法正常工作。我也尝试让函数返回一个float32,并且只是通过值传递变量,然后将positionOnEdge设置为返回值。我确实知道,无论positionOnEdge正在更新哪里,seg故障都会发生。 – Ben