< Previous by Date Date Index Next by Date >
  Thread Index Next in Thread >

[reSIProcate] Conditional compile should not change object sizes


Title: Message
I have been hit by this twice now: 
 
There are header files that define classes with different sizes based upon
conditional compilation.  The preprocessor macros are set by choices in
build/Makefile.conf.   In particular for today's svn version, these include
USE_IPV6 and RESIP_DATA_LOCAL_SIZE.
 
If application code uses the header files without defining the macros
identically, then instances of the class (and any that are compositions with
that class) can be of different sizes in the library and application.  The net
result of this size difference is that the application's calling code will have its 
memory corrupted since it is not allocating the size the library expects.
 
An example:
 
class TransportSelector
{
...
 
private:
...
 
#ifdef USE_IPV6
      struct sockaddr_in6 mUnspecified6;
#endif
}
So now if the application fails to define USE_IPV6, TransportSelector is 28
bytes shorter from the application's perspective than the library's -- and so is
TransportController and SipStack, etc.
 
It appears somebody tried to address this with the ApiCheck and ApiCheckList
classes.  However, the only way to use them would be to pass each possibly
affected class and its size to the ApiCheck class, something cumbersome and
not very robust in terms of keeping up with library changes.
 
I think a longer term solution would be to make TransportSelector an interface
class (only pure virtual methods), and use a TransportSelectorFactory that
could be conditionally compiled to instantiate the correct implementation
class.  This of course has the problem of breaking value semantics (sigh).
 
 
Dennis Dupont
Senior Systems Architect
Intelemedia Communications, Inc.