[xsd-users] Possible bug

Barrie Kovish barrie.kovish at singularsoftware.com
Tue Aug 31 12:24:17 EDT 2010


I'm getting a fatal exception when I attempt to copy an instance of an XSD generated class.   
Any suggestions?

My code for this is pretty simple:

    assert( NULL != pHouseComplete );
    assert( NULL != pHouse );
    assert( NULL != pHouseComplete->_root());
    assert( NULL != pHouse->_root());
    assert( 1 == pHouseComplete->address().size());

    if( pHouse != pHouseComplete )
    { 

        *pHouse = *pHouseComplete;
    }

Both pHouseComplete and pHouse are retrieved from the object model using an XPATH query and then converted to the corresponding Code Synthesis generated object.  

Here is the call stack when the problem occurs:
    My.dll!xsd::cxx::tree::_type::dom_element_info::clone(xsd::cxx::tree::_type & tree_node={...}, xsd::cxx::tree::_type * c=0x05b36e48)  Line 798	C++
    My.dll!xsd::cxx::tree::_type::_type(const xsd::cxx::tree::_type & x={...}, xsd::cxx::tree::flags __formal={...}, xsd::cxx::tree::_type * c=0x05b36e48)  Line 961	C++
    My.dll!xsd::cxx::tree::simple_type<xsd::cxx::tree::_type>::simple_type<xsd::cxx::tree::_type>(const xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> & other={...}, xsd::cxx::tree::flags f={...}, xsd::cxx::tree::_type * c=0x05b36e48)  Line 37	C++
    My.dll!xsd::cxx::tree::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >(const xsd::cxx::tree::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> > & x={...}, xsd::cxx::tree::flags f={...}, xsd::cxx::tree::_type * c=0x05b36e48)  Line 150	C++
    My.dll!xsd::cxx::tree::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >::_clone(xsd::cxx::tree::flags f={...}, xsd::cxx::tree::_type * c=0x05b36e48)  Line 27	C++
    My.dll!xsd::cxx::tree::sequence_common::operator=(const xsd::cxx::tree::sequence_common & v={...})  Line 909	C++
    My.dll!xsd::cxx::tree::sequence<xsd::cxx::tree::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >,0>::operator=(const xsd::cxx::tree::sequence<xsd::cxx::tree::string<char,xsd::cxx::tree::simple_type<xsd::cxx::tree::_type> >,0> & __that={...}) 	C++
    My.dll!house::operator=(const FCPXML4::file & __that={...}) 	C++


Here is the code in file elements.hxx where the problem occurs:


        virtual std::auto_ptr<dom_info>
          clone (type& tree_node, container* c) const
          {
            using std::auto_ptr;

            // Check if we are a document root.
            //
            if (c == 0)
            {
              // We preserver DOM associations only in complete
              // copies from root.
              //
              if (doc_.get () == 0)
                return auto_ptr<dom_info> (0);

              return auto_ptr<dom_info> (
                new dom_element_info (*doc_, tree_node));
            }

            // Check if our container does not have DOM association (e.g.,
            // because it wasn't a complete copy of the tree).
            //
            using xercesc::DOMNode;

            DOMNode* cn (c->_node ());

            if (cn == 0)
              return auto_ptr<dom_info> (0);


            // Now we are going to find the corresponding element in
            // the new tree.
            //
            {
              using xercesc::DOMElement;

              DOMNode& pn (*e_.getParentNode ());
              assert (pn.getNodeType () == DOMNode::ELEMENT_NODE);

              DOMNode* sn (pn.getFirstChild ()); // Source.
              DOMNode* dn (cn->getFirstChild ()); // Destination.

              // We should have at least one child.
              //
              assert (sn != 0);

              // Move in parallel until we get to the needed node.
              //
              for (; sn != 0 && !e_.isSameNode (sn);)                                       <== Barrie: It appears that e.isSameNode returns true hence dn is not set.
              {
                sn = sn->getNextSibling ();
                dn = dn->getNextSibling ();
              }

              // e_ should be on the list.
              //
              assert (sn != 0);

              assert (dn->getNodeType () == DOMNode::ELEMENT_NODE);     <== Barrie: dn is NULL

              return auto_ptr<dom_info> (
                new dom_element_info (static_cast<DOMElement&> (*dn),
                                      tree_node,
                                      false));
            }
          }




More information about the xsd-users mailing list