Hi Lubos
On 25/03/11 18:52, Lubos Lunak wrote:
On Friday 25 of March 2011, Noel Power wrote:
Ewww ...
class SAL_DLLPUBLIC_EXPORT IFieldmark
: virtual public IMark
...
class SAL_DLLPUBLIC_EXPORT ICheckboxFieldmark
: virtual public IFieldmark
...
IFieldmark* pFieldmark = ...
...
ICheckboxFieldmark* pCheckboxFm =
reinterpret_cast<ICheckboxFieldmark*>(pFieldmark);
You really don't want to reinterpret_cast up and down virtual inheritance.
undoubtedly ( and I was uneasy about it ) but... before posting the
patch I did check with valgrind and also printing out the result of the
pointers from the reinterpret_cast vrs the dynamic_cast ( on both the
working 64 & 32 builds ) and then valgrind again on the problematic
32bit ( with hack applied )
Does your changing from dynamic_cast to reinterpret_cast actually really fix
it? Since both the classes are defined in the same place, the only reasonable
explanation I see for this is that somebody got the casting similarly wrong
in another place and doing it wrong here too "undoes" the first wrong. I
don't have a very good explanation why this would be different for 32/64bit
though.
its worse as it's not just a 32bit vrs 64bit issue, its just the distro
( patches applied ) 32 that fails, all other distro/no-distro 32/64bit
combos work :-/
I don't have any 32bit build, could you try with yourself few more things?
First, using Valgrind is always a good idea,
absolutely ( and I did that before even posting here )
and second, the output of
something like this could be interesting too:
printf( "%p %p %s %p %p %s %p %p %s\n", ptr, dynamic_cast< void*>( ptr ),
typeid( *ptr ).name(), pFieldmark, dynamic_cast< void*>( pFieldmark ),
typeid( *pFieldmark ).name(), pCheckboxFm, dynamic_cast< void*>(
pCheckboxFm ), typeid( *pCheckboxFm ).name());
(where 'ptr' is what you get from the pMarksAccess->makeNoTextFieldBookmark()
call before casting to anything).
I'll check that later ( I didn't know about the typeid method ) so
thats a nice hint. Hmm I was concentrating so much on the circumstances
of the problem I missed a safer fix, the dynamic_cast/reinterpret_cast
is not really necessary it's more a convenience ( to be able to call the
Set/IsChecked methods ) but these methods themselves only call
IFieldmark related (pure) virtual methods and no ICheckboxmark related
functions ( which might someway explain why the hack works without
memory foobar )
Still I think there is something strange happening here, I would suspect
that you are halfway right and there is maybe somewhere a fundamental
error that we get away with somehow in all cases except the distro 32
bit. But really I admit I have no clue yet. I post the results of the
debug later when I get a chance, maybe it might throw some light
thanks again
Noel
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.