[poppler] Compiling poppler with clang

Thomas Freitag Thomas.Freitag at kabelmail.de
Sun Aug 26 23:29:40 PDT 2012


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.

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
>
> .
>




More information about the poppler mailing list