在mingw中编译分段错误但在linux上没有gcc。

时间:2016-09-07 02:25:14

标签: c++ mingw-w64

我正在尝试建立谷歌的液体乐趣库,但是在使用mingw的Windows上我得到了一个我有点难以接受的段错误。此方法中的编译失败

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;如果我发表评论说它会成功编译,那么这就是导致问题的因素,但显然会在运行时创建一个无限循环。我有点想法为什么它只会在mingw中导致seg故障,甚至将行更改为positionOnEdge + = 0.0f;导致它发生段错误。

1 个答案:

答案 0 :(得分:0)

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

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

您声称已将编译崩溃隔离到:

positionOnEdge += stride;

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

当然,您可以随时检查您是否拥有最新版本的编译器。如果没有,请升级,并希望当前版本的编译器已修复该错误。