[ITK-users] Segfault in Wiki Example: QuadEdgeMeshParameterizationFilter

DVigneault davis.vigneault at gmail.com
Fri Jun 5 11:09:17 EDT 2015


All--

While running the QuadEdgeMesh Parameterization example from the wiki [1]
using the provided spherical mesh, I got a segfault on
itkBorderQuadEdgeMeshFilter.hxx:75:

InputIteratorGeom it = bdryEdge->BeginGeomLnext();

The options I used were ./program sphere.vtk 0 0 output.vtk

After some investigation, I believe it may be that sphere.vtk has no
internal edges.  Therefore, BorderQuadEdgeMeshFilter::Evaluate is returning
an empty std::list, and list->Begin() is eventually dereferenced on the
above line.  Should an itkWarningMacro() or itkExceptionMacro() be placed
before the above line, checking whether the list is empty?  Or should this
be on the user?

[1]
http://www.itk.org/Wiki/ITK/Examples/Meshes/QuadEdgeMeshParameterizationFilter

One other thing that's a bit confusing--if I pass ./program sphere.vtk 1 0
output.vtk (using DISK_BORDER_TRANSFORM instead of SQUARE_BORDER_TRANSFORM),
there is no segfault in the wiki example.  In the small program below,
however, it segfaults in either case.

Here's a program that describes the problem:

#include "itkRegularSphereMeshSource.h"
#include "itkBorderQuadEdgeMeshFilter.h"

typedef itk::QuadEdgeMesh< double, 3 >                TMesh;
typedef itk::RegularSphereMeshSource< TMesh > TSource;
typedef itk::QuadEdgeMeshBoundaryEdgesMeshFunction< TMesh > TBorderFunction;
typedef itk::BorderQuadEdgeMeshFilter< TMesh, TMesh > TBorder;
int main( int argc, char* argv[] )
{

  TSource::Pointer source = TSource::New();
  source->Update();
  TMesh::Pointer mesh = source->GetOutput();

  TBorderFunction::Pointer fn = TBorderFunction::New();
  TMesh::EdgeListPointerType list = fn->Evaluate( *(mesh) );
  std::cout << list->size() << std::endl; // 0
  // A sphere has no internal edges
  // Returns a std::list size zero
  
  TBorder::Pointer border = TBorder::New();
  border->SetTransformType( TBorder::SQUARE_BORDER_TRANSFORM );
  // Segfaults even if I change this to DISK_BORDER_TRANSFORM
  border->SetInput( mesh );
  border->Update(); // Segfault
  // itkBorderQuadEdgeMeshFilter.hxx:110
  // empty std::list is assigned to oborder_it
  // for loop is bypassed b/c list->begin() == list->end()
  // InputQEType* output = *oborder_it;
  // return output; from ComputeLongestBorder
  // InputQEType *bdryEdge = ComputeLongestBorder();

  // Segfault:
  // itkBoarderQuadEdgeMeshFilter.hxx:75
  // InputIteratorGeom it = bdryEdge->BeginGeomLnext();

  return EXIT_SUCCESS;

}




--
View this message in context: http://itk-users.7.n7.nabble.com/Segfault-in-Wiki-Example-QuadEdgeMeshParameterizationFilter-tp35771.html
Sent from the ITK - Users mailing list archive at Nabble.com.


More information about the Insight-users mailing list