[Development] Possible binary compatibility problem in a future Qt version

Olivier Goffart olivier at woboq.com
Wed Aug 29 14:46:17 CEST 2012


Reviving old thread because it was discussed on IRC:

On Friday 08 June 2012 10:31:31 Jedrzej Nowacki wrote:
> Hi,
> 
>   Qt meta-type system is assuming that type information is constant and
> consistent. It make sense because in C++ a type trait can not be changed
> during execution of an application. We agreed that unregistering of a type
> is a bad idea and that updating a type data can cause malfunction in Qt
> itself (not mentioning external library or applications). In Qt5 we
> introduced a lot of template based auto-detection for different features.
> Most of the data gathered by QTypeInfo, QMetaTypeId helpers classes are
> stored in QMetaType internal data, so it can also be used during a runtime
> introspection. So far so good, we have inlined data which is constant and
> consistent with data that we stored in QMetaType. So what will happen if we
> compile an application with an older Qt and link against a newer one,
> assuming that we introduced or changed a new type's information? Nothing
> special :-), during type registration old data will be registered, so again
> both source of type data would be consistent.
> 
>   To break the current design a 3rd client of the type data has to be
> introduced. It can be Qt itself or a library linked with Qt. So lets create
> theoretical situation that we created a new type flag isPointerToGObject in
> Qt5.1. Then someone write an application that is compiled against Qt5.1 and
> use that flag with a type T that is coming from a 3rd party library compiled
> with Qt5.0. Now, if both, the application and the library register the same
> type T in Qt we will detect binary incompatible registration. It will be
> like that because the application will have different feature detection
> inlined code then the library.
> 
>   What can go wrong then? From nothing to crash, it depends on the flag. For
> example if the flag is just an optimization hint, like
> "typeHasThreadSafeConstructor" then it is quite safe because we could
> "downgrade" the registered data to a safe value, it would work, maybe a bit
> slower :-). On other hand isPointerToGObject doesn't have such safe value,
> because it points to a feature that is rather a type description.

What's wrong by saying that when there are "binary incompatible" registration, 
we keep the maximum of flag set?  So the second registration which say the 
type is a PointerToGObject override the previous one.

The code that expect PointerToGObject to be set for a given type will continue 
to work because that library should register that type.

>   Currently we save "NeedsConstruction", "NeedsDestruction", "MovableType",
> "PointerToQObject", "IsEnumeration" flags. It would be great to save more in
> future, as it is really useful. Please mark that if there is a bug in code
> that detects the last two features, we will not be able to fix it until
> Qt6.
> 
>   What now? We can:
>   1. ignore the problem as an edge case, to be honest the scenario is quite
> complex.
>   2. create a policy to add only "downgradable" flags, so in case of
> problems we will fall-back to a safe value.
>   3. start versioning types data, always access a data information with a
> special implicit marker.
>   4. drop concept completely.
> 
>   I believe that only option 2 and 3 are acceptable, but I would love to
> know what you think.

-- 
Olivier

Woboq - Qt services and support - http://woboq.com




More information about the Development mailing list