Problem 2336 - The hardcoded size 10000 in G4GDMLWrite causes the values in GDML truncated
Summary: The hardcoded size 10000 in G4GDMLWrite causes the values in GDML truncated
Status: RESOLVED FIXED
Alias: None
Product: Geant4
Classification: Unclassified
Component: persistency/gdml (show other problems)
Version: other
Hardware: All All
: P4 minor
Assignee: Witold.Pokorski
URL:
Depends on:
Blocks:
 
Reported: 2021-02-23 10:59 CET by Tao Lin
Modified: 2021-03-04 20:07 CET (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this problem.
Description Tao Lin 2021-02-23 10:59:22 CET
Dear Geant4 developers,

We have several optical properties are truncated in the output of GDML due to the size of the values is greater than 10000:
* https://geant4.kek.jp/lxr/source/persistency/gdml/include/G4GDMLWrite.hh#L135
* https://geant4.kek.jp/lxr/source/persistency/gdml/src/G4GDMLWrite.cc#L158

To avoid such truncated, it would be better to use another "transcode" method: https://xerces.apache.org/xerces-c/apiDocs-3/classXMLString.html#a0f2f01d4ff14825e65bec0b709a401e2
My changes are attached at the end. 

Thank you!

Tao Lin

Here are my changes to the source code using "diff -ur":

--- source/persistency/gdml/include/G4GDMLWrite.hh.old  2021-02-23 17:47:11.667478445 +0800
+++ source/persistency/gdml/include/G4GDMLWrite.hh      2021-02-23 17:47:37.016846762 +0800
@@ -132,7 +132,7 @@
     xercesc::DOMDocument* doc = nullptr;
     xercesc::DOMElement* extElement = nullptr;
     xercesc::DOMElement* userinfoElement = nullptr;
-    XMLCh tempStr[10000];
+
     G4GDMLAuxListType auxList;
     G4bool overwriteOutputFile = false;
 };

--- source/persistency/gdml/src/G4GDMLWrite.cc.old      2021-02-23 17:47:03.943366217 +0800
+++ source/persistency/gdml/src/G4GDMLWrite.cc  2021-02-23 17:54:11.249575039 +0800
@@ -155,10 +155,15 @@
 xercesc::DOMAttr* G4GDMLWrite::NewAttribute(const G4String& name,
                                             const G4String& value)
 {
-  xercesc::XMLString::transcode(name, tempStr, 9999);
+  XMLCh* tempStr = NULL;
+  tempStr = xercesc::XMLString::transcode(name);
   xercesc::DOMAttr* att = doc->createAttribute(tempStr);
-  xercesc::XMLString::transcode(value, tempStr, 9999);
+  xercesc::XMLString::release(&tempStr);
+
+  tempStr = xercesc::XMLString::transcode(value);
   att->setValue(tempStr);
+  xercesc::XMLString::release(&tempStr);
+
   return att;
 }

@@ -166,22 +171,32 @@
 xercesc::DOMAttr* G4GDMLWrite::NewAttribute(const G4String& name,
                                             const G4double& value)
 {
-  xercesc::XMLString::transcode(name, tempStr, 9999);
+  XMLCh* tempStr = NULL;
+  tempStr = xercesc::XMLString::transcode(name);
   xercesc::DOMAttr* att = doc->createAttribute(tempStr);
+  xercesc::XMLString::release(&tempStr);
+
   std::ostringstream ostream;
   ostream.precision(15);
   ostream << value;
   G4String str = ostream.str();
-  xercesc::XMLString::transcode(str, tempStr, 9999);
+
+  tempStr = xercesc::XMLString::transcode(str);
   att->setValue(tempStr);
+  xercesc::XMLString::release(&tempStr);
+
   return att;
 }

 // --------------------------------------------------------------------
 xercesc::DOMElement* G4GDMLWrite::NewElement(const G4String& name)
 {
-  xercesc::XMLString::transcode(name, tempStr, 9999);
-  return doc->createElement(tempStr);
+  XMLCh* tempStr = NULL;
+  tempStr = xercesc::XMLString::transcode(name);
+  xercesc::DOMElement* elem = doc->createElement(tempStr);
+  xercesc::XMLString::release(&tempStr);
+
+  return elem;
 }

 // --------------------------------------------------------------------
@@ -212,13 +227,17 @@
   VolumeMap().clear();  // The module map is global for all modules,
                         // so clear it only at once!

-  xercesc::XMLString::transcode("LS", tempStr, 9999);
+  XMLCh* tempStr = NULL;
+  tempStr = xercesc::XMLString::transcode("LS");
   xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr);
-  xercesc::XMLString::transcode("Range", tempStr, 9999);
+  xercesc::XMLString::release(&tempStr);
+  tempStr = xercesc::XMLString::transcode("Range");
   xercesc::DOMImplementation* impl =
     xercesc::DOMImplementationRegistry::getDOMImplementation(tempStr);
-  xercesc::XMLString::transcode("gdml", tempStr, 9999);
+  xercesc::XMLString::release(&tempStr);
+  tempStr = xercesc::XMLString::transcode("gdml");
   doc                       = impl->createDocument(0, tempStr, 0);
+  xercesc::XMLString::release(&tempStr);
   xercesc::DOMElement* gdml = doc->getDocumentElement();

 #if XERCES_VERSION_MAJOR >= 3
Comment 1 Witold.Pokorski 2021-03-04 20:07:00 CET
Thank you for spotting the problem and providing the fix. You patch is now in git master and will be part of the next release.