[poppler] Compiling poppler with clang

Albert Astals Cid aacid at kde.org
Mon Aug 27 13:31:13 PDT 2012


El Dilluns, 27 d'agost de 2012, a les 08:29:40, Thomas Freitag va escriure:
> On 27.08.2012 00:56, Albert Astals Cid wrote:
> > El Diumenge, 26 d'agost de 2012, a les 15:48:37, He Liu va escriure:
> >>>> 5. vtable pointer will be overwritten
> >>>> Function.cc:422:10: warning: destination for this 'memcpy' call is a
> >>>> pointer to dynamic class 'SampledFunction'; vtable pointer will be
> >>>> overwritten [-Wdynamic-class-memaccess]
> >>>> 
> >>>>    memcpy(this, func, sizeof(SampledFunction));
> >>>>    ~~~~~~ ^
> >>>> 
> >>>> Function.cc:422:10: note: explicitly cast the pointer to silence this
> >>>> warning
> >>>> 
> >>>> At least categrory 5. sound serious to me, I would never have copied
> >>>> instances of C++ objects in that way, because it depends on the
> >>>> compiler
> >>>> and the class if this causes problems on runtime, s. i.e.
> >>>> http://weseetips.com/tag/afx_zero_init_object/,
> >>> 
> >>> Note this is memset-ing to 0, not memcpy-ing a class to itself. To be
> >>> honest i agree memcpy'in a SampledFunction to a SampledFunction is ugly,
> >>> but i fail to see why it would not work.
> 
> It works, at least with the actual used compilers. But it works only,
> because the allocated members of SampledFunction are overwriten after
> doing the memcpy. And this behaviour makes it just more ugly in my eyes.
> And this is the same with the other memcpy's in ExponentialFunction,
> StitchingFunction and PostScriptFunction. And it will work till such
> time as everybody who changes the class will not forget to do it in the
> same way. So if You are not willing to change it (or let somebody else
> change it, I know, never change running code), we could use the hint:
> explicitly cast the pointer to silence this warning.

I'm fine with someone fixing the code. Less warnings is always good, but for 
master, there's no need to introduce a pontential breaker just because clang 
complains.

Cheers,
  Albert

> 
> Cheers,
> Thomas
> 
> >> Hi Albert,
> >> 
> >> :-)
> >> 
> >> A pointer of type SampleFunction* could be pointing to an instance of a
> >> SampleFunction sub-class, which has different vtable contents.
> > 
> > No, it could not, SampledFunction does not have any childs and the
> > function
> > doing that memcopy is private anyway.
> > 
> >> As a result,
> >> one could construct a SampleFunction with SampleFunction(SampleFunction
> >> *)
> >> using a pointer to a sub-class instance, and overwrite the
> >> SampleFunction's
> >> vtable address with the sub-class's vtable address.
> >> 
> >> I am not sure if it will lead to any bugs/vulnerabilities in this case,
> >> but
> >> it is not safe practice in general.
> > 
> > Sure, i never said it was. I'm just saying i don't see why it would not
> > work in our case.
> > 
> >> Since the vtable structure depends on
> >> how the compiler is implemented, memcpy or memset on object pointers will
> >> generally lead to undefined behaviors.
> > 
> > I'm far from a compiler expert, but one would hope that for a given class
> > the compiler stores always the "stuff" in the same order in memory, so
> > again, i fail to see why this should fail in our case.
> > 
> > Cheers,
> > 
> >    Albert
> >> 
> >> Thanks.
> >> _______________________________________________
> >> poppler mailing list
> >> poppler at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/poppler
> > 
> > _______________________________________________
> > poppler mailing list
> > poppler at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/poppler
> > 
> > .
> 
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler


More information about the poppler mailing list