2010-08-02 5 views
0

J'ai trouvé que mes application se bloque avec une exception de référence null ici en sweep.c dans le code source GLU:Pourquoi GLU planterait-il à cet endroit?

static void ConnectLeftVertex(GLUtesselator *tess, GLUvertex *vEvent) 
/* 
* Purpose: connect a "left" vertex (one where both edges go right) 
* to the processed portion of the mesh. Let R be the active region 
* containing vEvent, and let U and L be the upper and lower edge 
* chains of R. There are two possibilities: 
* 
* - the normal case: split R into two regions, by connecting vEvent to 
* the rightmost vertex of U or L lying to the left of the sweep line 
* 
* - the degenerate case: if vEvent is close enough to U or L, we 
* merge vEvent into that edge chain. The subcases are: 
* - merging with the rightmost vertex of U or L 
* - merging with the active edge of U or L 
* - merging with an already-processed portion of U or L 
*/ 
{ 
    ActiveRegion *regUp, *regLo, *reg; 
    GLUhalfEdge *eUp, *eLo, *eNew; 
    ActiveRegion tmp; 

    /* assert(vEvent->anEdge->Onext->Onext == vEvent->anEdge); */ 

    /* Get a pointer to the active region containing vEvent */ 
    tmp.eUp = vEvent->anEdge->Sym; 
    /* __GL_DICTLISTKEY */ /* __gl_dictListSearch */ 
    regUp = (ActiveRegion *)dictKey(dictSearch(tess->dict, &tmp)); 
    regLo = RegionBelow(regUp); 
    eUp = regUp->eUp; 
    eLo = regLo->eUp; //CRASHES RIGHT HERE SINCE RegLo is = 0x000000 FOR SOME REASON 

    /* Try merging with U or L first */ 
    if(EdgeSign(eUp->Dst, vEvent, eUp->Org) == 0) { 
    ConnectLeftDegenerate(tess, regUp, vEvent); 
    return; 
    } 

    /* Connect vEvent to rightmost processed vertex of either chain. 
    * e->Dst is the vertex that we will connect to vEvent. 
    */ 
    reg = VertLeq(eLo->Dst, eUp->Dst) ? regUp : regLo; 

    if(regUp->inside || reg->fixUpperEdge) { 
    if(reg == regUp) { 
     eNew = __gl_meshConnect(vEvent->anEdge->Sym, eUp->Lnext); 
     if (eNew == NULL) longjmp(tess->env,1); 
    } else { 
     GLUhalfEdge *tempHalfEdge= __gl_meshConnect(eLo->Dnext, vEvent->anEdge); 
     if (tempHalfEdge == NULL) longjmp(tess->env,1); 

     eNew = tempHalfEdge->Sym; 
    } 
    if(reg->fixUpperEdge) { 
     if (!FixUpperEdge(reg, eNew)) longjmp(tess->env,1); 
    } else { 
     ComputeWinding(tess, AddRegionBelow(tess, regUp, eNew)); 
    } 
    SweepEvent(tess, vEvent); 
    } else { 
    /* The new vertex is in a region which does not belong to the polygon. 
    * We don''t need to connect this vertex to the rest of the mesh. 
    */ 
    AddRightEdges(tess, regUp, vEvent->anEdge, vEvent->anEdge, NULL, TRUE); 
    } 
} 

Il semble que eRegLo est un pointeur NULL parfois ce qui provoque le plantage de mon application. Comment puis-je modifier la source pour l'empêcher de planter mon application?

Merci

+0

Se pourrait-il que 'RegionBelow()' renvoie 'null' en cas d'erreur? – Bobby

Répondre

1

Vous aurez à regarder dans la source pour RegionBelow et voir si et quand il peut retourner un pointeur NULL. Entre votre appel à RegionBelow et votre référence de regLo, effectuez une vérification regLo == NULL. Vous pouvez le faire avec un assert ou en lançant une exception (en C++). Très probablement, si RegionBelow peut renvoyer NULL en cas d'erreur, il existe une autre méthode que vous pouvez utiliser pour déterminer l'erreur et comment la gérer. Vous devrez consulter le code source ou la documentation RegionBelow pour trouver cette information.

Questions connexes