On Tue, Sep 20, 2011 at 03:08:18PM -0500, Bollinger, John C wrote:
> Hello All,

Hi,

> 
> I am attempting to build PDFedit v 0.4.5 on CentOS 5, using the
> distro's provided GCC 4.1.2 toolchain.  I am encountering a cluster
> of related compilation errors that appear the same as, or at least
> closely related to, the one discussed in this previous thread:
>
> http://sourceforge.net/mailarchive/forum.php?thread_name=20100521074048.GG4000%40tiehlicka.suse.cz&forum_name=pdfedit-support
> 
> I encounter exactly the same compiler error that the OP in that thread 
> reported, plus a few more:
> 
> g++ -c -g -O2   -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fno-strict-aliasing 
> -fexceptions   -fstack-protector -pipe -posix -ansi -std=c++98 -pedantic -I. 
> -I/home/jbolling/rpm/BUILD/pdfedit-0.4.5/src 
> -I/home/jbolling/rpm/BUILD/pdfedit-0.4.5/src/xpdf/  -I/usr/include 
> -I/usr/include/freetype2  -I/usr/include -o cpagecontents.o cpagecontents.cc
> cpagecontents.cc: In member function 'void 
> pdfobjects::CPageContents::addInlineImage(const std::vector<char, 
> std::allocator<char> >&, const libs::Point&, const libs::Point&)':
> cpagecontents.cc:543: warning: passing 'const double' for argument 1 to 
> 'pdfobjects::CObjectSimple<Tp>::CObjectSimple(const typename 
> pdfobjects::PropertyTraitSimple<Tp>::value&) [with pdfobjects::PropertyType 
> Tp = pInt]'
> /usr/include/boost/noncopyable.hpp: In copy constructor 
> 'pdfobjects::CObjectSimple<pInt>::CObjectSimple(const 
> pdfobjects::CObjectSimple<pInt>&)':
> /usr/include/boost/noncopyable.hpp:27: error: 
> 'boost::noncopyable_::noncopyable::noncopyable(const 
> boost::noncopyable_::noncopyable&)' is private
> /home/jbolling/rpm/BUILD/pdfedit-0.4.5/src/kernel/cobjectsimple.h:104: error: 
> within this context
> cpagecontents.cc: In member function 'void 
> pdfobjects::CPageContents::addInlineImage(const std::vector<char, 
> std::allocator<char> >&, const libs::Point&, const libs::Point&)':
> cpagecontents.cc:543: note: synthesized method 
> 'pdfobjects::CObjectSimple<pInt>::CObjectSimple(const 
> pdfobjects::CObjectSimple<pInt>&)' first required here
> cpagecontents.cc:544: warning: passing 'const double' for argument 1 to 
> 'pdfobjects::CObjectSimple<Tp>::CObjectSimple(const typename 
> pdfobjects::PropertyTraitSimple<Tp>::value&) [with pdfobjects::PropertyType 
> Tp = pInt]'
> /usr/include/boost/noncopyable.hpp: In copy constructor 
> 'pdfobjects::CObjectSimple<pName>::CObjectSimple(const 
> pdfobjects::CObjectSimple<pName>&)':
> /usr/include/boost/noncopyable.hpp:27: error: 
> 'boost::noncopyable_::noncopyable::noncopyable(const 
> boost::noncopyable_::noncopyable&)' is private
> /home/jbolling/rpm/BUILD/pdfedit-0.4.5/src/kernel/cobjectsimple.h:104: error: 
> within this context
> cpagecontents.cc: In member function 'void 
> pdfobjects::CPageContents::addInlineImage(const std::vector<char, 
> std::allocator<char> >&, const libs::Point&, const libs::Point&)':
> cpagecontents.cc:545: note: synthesized method 
> 'pdfobjects::CObjectSimple<pName>::CObjectSimple(const 
> pdfobjects::CObjectSimple<pName>&)' first required here
> 
> 
> I will address the warnings in a separate message.  Right now, observe
> that g++ complains not just about line 545, where attention focused
> during the previous discussion, but also about line 544.  In fact, in
> my experiments I found that the compiler will make the same complaint
> about an inaccessible copy constructor for each of these lines:
> 
>         image_dict.addProperty ("W", CInt (image_size.x));
>         image_dict.addProperty ("H", CInt (image_size.y));
>         image_dict.addProperty ("CS", CName ("RGB"));
>         image_dict.addProperty ("BPC", CInt (8));

Yes the problem is already fixed in CVS. The issue is that this
particular gcc version doesn't like r-value (constructor) for a const
reference parameter without a copy constructor. There is no reason to
use the copy constructor here because the object is for the single use
without any external aliases.
Strictly speaking C++ standard enables such a behavior so we have
addressed the issue simply by creating a temporal object.
        CInt W (image_size.x);
        image_dict.addProperty ("W", W);

> 
> It appears, then, that g++ decides it must make copies of the CInt and
> CName arguments, even though the method prototype specifies that the
> arguments are references.  Perhaps g++ wants to copy the arguments
> and then pass references to the copies.  

Exactly.

> That could be a GCC bug, 

Not a bug as I said above. C++ standard enables that. I would rather
call it suboptimality.

> but it draws attention to a PDFEdit bug here: the program is
> attempting to store references to local CInt and CName objects in a
> CDict whose lifetime exceeds theirs.

No. Arguments are deep copied (we are using clone method). Have a look
at CDict::addProperty method.

> 
> That is, to the best of my understanding, the lifetime of local
> objects instantiated in an argument list is limited to the function
> call to which they are arguments (i.e. each addProperty() call),
> whereas image_dict lives until the end of the method.  
>
> Even if that were not so, it appears that the method also leaks
> references to these local CInt and CName objects when it subsequently
> uses the constructed image_dict to initialize a CInlineImage allocated
> on the heap (thus using longer-lived local objects would not solve the
> problem).
> 
> In any event, the compiler is satisfied if I change the above four lines like 
> so:
> 
>         image_dict.addProperty ("W", *(new CInt (image_size.x)));
>         image_dict.addProperty ("H", *(new CInt (image_size.y)));
>         image_dict.addProperty ("CS", *(new CName ("RGB")));
>         image_dict.addProperty ("BPC", *(new CInt (8)));
> 
> That obviously leaks memory, but it's better than the program
> accessing who-knows-what through dangling references.  It also
> demonstrates to my satisfaction that the problem is not with the
> compiler being confused about types, but rather with its approach to
> handling the type locality issue, possibly in conjunction with some
> optimization it attempts to apply.
>
> To sum up, there appears to be a cluster of PDFedit bugs here, even
> when the original code compiles successfully.  I don't see any simple
> fix that would be adequate, but perhaps those of you who are more
> familiar with

Does the deep copying answers your concern?

> Best,
> 
> John Bollinger
> 
> 
> Email Disclaimer:  www.stjude.org/emaildisclaimer

-- 
Michal Hocko

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
Pdfedit-support mailing list
Pdfedit-support@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdfedit-support

Reply via email to