Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


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.