[ITK-dev] #include <nifti1_io.h> leaking from itkNiftiImageIO.h into user code (+ 3 ways to fix it)

Niels Dekker niels-xtk at xs4all.nl
Fri Jun 23 11:05:15 EDT 2017


Hi Bradley,

Thank you for your encouraging feedback  :-)  Please have a look at our 
proxy based fix: "COMP: Fixed <nifti1_io.h> leak into user code", 
http://review.source.kitware.com/#/c/22461/


Kind regards, Niels

On 2017-06-22 16:58, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
> Hello,
> 
> I looked into this a little the other day. I tried #2, but it did not
> work due to the way `nifty_image` is a typedef an anonymous structure.
> 
> Your #3 approach looks good to me. I look forward to seeing the patch.
> 
> You can also make ITKNIFTI a private dependency for the module by
> undoing the following:
> https://github.com/InsightSoftwareConsortium/ITK/commit/67e308fc8470c8119323a8954d53c777966c5ad5
> 
> 
> On 6/22/17, 10:18 AM, "Niels Dekker" <niels-xtk at xs4all.nl> wrote:
> 
>     We're glad to see our niftilib-name-mangling patch made it into the
>     master branch:
> 
> https://github.com/InsightSoftwareConsortium/ITK/commit/370c3116d3edac3a3bc36e03e1b1b655df0f04af
> 
>     Now we do have another nifty ITK issue! itkNiftiImageIO.h has an
>     '#include <nifti1_io.h>', which leaks into user code:
> 
> https://github.com/InsightSoftwareConsortium/ITK/blob/61e8029ef53e2d37cfa3c5bad999e582326e36ee/Modules/IO/NIFTI/include/itkNiftiImageIO.h#L26
>     Our project uses both ITK and the NiftyReg library, and thereby
>     indirectly uses two different versions of the niftilib library, 
> with
>     different versions of <nifti1_io.h>, so we foresee potential 
> conflicts
>     in the current situation. itkNiftiImageIO.h only needs 
> <nifti1_io.h> for
>     its 'nifti_image' typedef, as it has a private member,
>     itk::NiftiImageIO::m_NiftiImage of type 'nifti_image *'. So 
> basically
>     <nifti1_io.h> is just an implementation detail of 
> itk::NiftiImageIO. It
>     is not part of the public interface of the ITK class.
> 
>     Do you think it would be feasible to move '#include <nifti1_io.h>' 
> from
>     itkNiftiImageIO.h to its CXX file, itkNiftiImageIO.cxx?
> 
>     We can think of three different ways to achieve this:
> 
>       1. The void pointer approach: Declare 
> itk::NiftiImageIO::m_NiftiImage
>     as a 'void *', instead of 'nifti_image *', and cast m_NiftiImage to
>     'nifti_image *' within itkNiftiImageIO.cxx, whenever needed. I 
> would
>     expect more than 200 casts, doing static_cast< nifti_image
>     *>(this->m_NiftiImage).
> 
>       2. The Pimpl way : Move the declaration of m_NiftiImage, and 
> possibly
>     any other data member of itk::NiftiImageIO, from itkNiftiImageIO.h 
> to
>     itkNiftiImageIO.cxx, according to the Pimpl idiom
>     http://wiki.c2.com/?PimplIdiom  All access to these data members 
> should
>     then be adapted accordingly, so this would result in many 
> modifications
>     of existing code in itkNiftiImageIO.cxx. Optionally, private member
>     function declarations could also be moved from itkNiftiImageIO.h to
>     itkNiftiImageIO.cxx this way. It seems like a lot of work.
> 
>       3. The proxy approach: Declare itk::NiftiImageIO::m_NiftiImage as 
> a
>     reference to a proxy, which behaves like a 'nifti_image *'. This 
> way, no
>     existing lines of code from itkNiftiImageIO.cxx would need to be
>     changed, except for the initialization of m_NiftiImage. The proxy 
> class
>     should be forward-declared in itkNiftiImageIO.h, and defined in
>     itkNiftiImageIO.cxx, for example as follows:
> 
>     	class NiftiImageProxy
>     	{
>     	  nifti_image* m_ptr;
>     	public:
>     	  NiftiImageProxy(nifti_image* ptr) ; // Converts pointer to 
> proxy.
>     	  operator nifti_image*();  // Converts proxy to pointer.
>     	  nifti_image* operator->();
>     	};
> 
>     We did fully implement and test the proxy approach, and we can make 
> a
>     patch, if you think that's an interesting option for ITK. What do 
> you
>     think?
> 
>     Kind regards, also on behalf of my colleague Floris Berendsen,
> 
>          Niels


-- 
Niels Dekker
Scientific programmer
LKEB, Leiden University Medical Center, Netherlands


More information about the Insight-developers mailing list