You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by "Miklos Fazekas (JIRA)" <xe...@xml.apache.org> on 2006/01/17 16:34:42 UTC

[jira] Created: (XERCESC-1550) symbols visibility + inline virtual desctructors => dynamic_cast failure in user code

symbols visibility + inline virtual desctructors => dynamic_cast<DOMElement> failure in user code
-------------------------------------------------------------------------------------------------

         Key: XERCESC-1550
         URL: http://issues.apache.org/jira/browse/XERCESC-1550
     Project: Xerces-C++
        Type: Bug
  Components: Build  
    Versions: 2.7.0    
 Environment: OSX GCC 4.0
    Reporter: Miklos Fazekas


We have a code like this:

XMLTest.cpp:

         DOMNodeList* nodes = doc->getElementsByTagName(L("TABLE"));
  	if ( int i=nodes->getLength() == 1 )
	{
		DOMNode* att_node = nodes->item(0);
		DOMElement* att_element = dynamic_cast<DOMElement*>(att_node);
                   printf ("Element:%d\n", att_element);
	} 

On OSX when we use symbols visibility attrbiutes, the dynamic_cast returns 0.

The issue seems to be the following:

1. There is two RTTI entries generated for the class. [According to C++ the RTTI is generated at the place of the implementation of first virtual function.]
2. One RTTI entry is marked with visibility("hidden") and found in usercode. The other one is marked with visibility("default").
3. It seems that if there's an RTTI marked as "hidden" the dynamic_cast can't work. Quote from http://gcc.gnu.org/wiki/Visibility :
" Symbol visibility is "default" by default but if it encounters just one definition with it hidden - just one - that typeinfo symbol becomes permanently hidden (remember the C++ standard's ODR - one definition rule).  " 

class CDOM_EXPORT DOMElement: public DOMNode {
public:
    ...
    virtual ~DOMElement() {};
    ...
}

Possible fixes:
a.) Implement the destructor in a C++ file, compiled into xerces c++. This would avoid multiple RTTI .
b.) set CDOM_EXPORT to visibility("default") even when it's used from the user code.

We choose a.) as it seems to be a nicer solution. 
[By the way i do not see why symbols visibility of GCC should work that crappy with dynamic_cast, but there's not too much i could do there.]

References:
http://gcc.gnu.org/wiki/Visibility


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org


[jira] Commented: (XERCESC-1550) symbols visibility + inline virtual desctructors => dynamic_cast failure in user code

Posted by "Tommi Vainikainen (JIRA)" <xe...@xml.apache.org>.
    [ http://issues.apache.org/jira/browse/XERCESC-1550?page=comments#action_12436513 ] 
            
Tommi Vainikainen commented on XERCESC-1550:
--------------------------------------------

Here is a patch for this problem. This problem also appears if you try to compile your own software which links to Xerces with gcc -fvisibility=hidden and use dynamic_cast for DOM types.

 util/Compilers/GCCDefs.hpp
--- util/Compilers/GCCDefs.hpp.orig     2006-09-21 15:21:17.000000000 +0300
+++ util/Compilers/GCCDefs.hpp  2006-09-21 15:22:39.000000000 +0300
@@ -37,9 +37,14 @@
 #define PLATFORM_EXPORT __declspec(dllexport)
 #define PLATFORM_IMPORT __declspec(dllimport)
 #else
+#if __GNUC__ >= 4
+#define PLATFORM_EXPORT __attribute__ ((visibility("default")))
+#define PLATFORM_IMPORT __attribute__ ((visibility("default")))
+#else
 #define PLATFORM_EXPORT
 #define PLATFORM_IMPORT
 #endif
+#endif

 // ---------------------------------------------------------------------------
 //  Indicate that we do not support native bools



> symbols visibility + inline virtual desctructors => dynamic_cast<DOMElement> failure in user code
> -------------------------------------------------------------------------------------------------
>
>                 Key: XERCESC-1550
>                 URL: http://issues.apache.org/jira/browse/XERCESC-1550
>             Project: Xerces-C++
>          Issue Type: Bug
>          Components: Build
>    Affects Versions: 2.7.0
>         Environment: OSX GCC 4.0
>            Reporter: Miklos Fazekas
>
> We have a code like this:
> XMLTest.cpp:
>          DOMNodeList* nodes = doc->getElementsByTagName(L("TABLE"));
>   	if ( int i=nodes->getLength() == 1 )
> 	{
> 		DOMNode* att_node = nodes->item(0);
> 		DOMElement* att_element = dynamic_cast<DOMElement*>(att_node);
>                    printf ("Element:%d\n", att_element);
> 	} 
> On OSX when we use symbols visibility attrbiutes, the dynamic_cast returns 0.
> The issue seems to be the following:
> 1. There is two RTTI entries generated for the class. [According to C++ the RTTI is generated at the place of the implementation of first virtual function.]
> 2. One RTTI entry is marked with visibility("hidden") and found in usercode. The other one is marked with visibility("default").
> 3. It seems that if there's an RTTI marked as "hidden" the dynamic_cast can't work. Quote from http://gcc.gnu.org/wiki/Visibility :
> " Symbol visibility is "default" by default but if it encounters just one definition with it hidden - just one - that typeinfo symbol becomes permanently hidden (remember the C++ standard's ODR - one definition rule).  " 
> class CDOM_EXPORT DOMElement: public DOMNode {
> public:
>     ...
>     virtual ~DOMElement() {};
>     ...
> }
> Possible fixes:
> a.) Implement the destructor in a C++ file, compiled into xerces c++. This would avoid multiple RTTI .
> b.) set CDOM_EXPORT to visibility("default") even when it's used from the user code.
> We choose a.) as it seems to be a nicer solution. 
> [By the way i do not see why symbols visibility of GCC should work that crappy with dynamic_cast, but there's not too much i could do there.]
> References:
> http://gcc.gnu.org/wiki/Visibility

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org