sbmlteam / libsbml

LibSBML is a native library for reading, writing and manipulating files and data streams containing the Systems Biology Markup Language (SBML). It offers language bindings for C, C++, C#, Java, JavaScript, MATLAB, Perl, PHP, Python, R and Ruby.
https://sbml.org/software/libsbml
Other
38 stars 28 forks source link

Segfault during validateSBML after SBMLDocument::clone() with SBML-multi #338

Closed dweindl closed 1 year ago

dweindl commented 1 year ago

With python-libsbml-5.20.1 (Python 3.11.4/linux) the following code segfaults:

import libsbml

model = """<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level3/version2/core" xmlns:multi="http://www.sbml.org/sbml/level3/version1/multi/version1" level="3" version="2" multi:required="true">
  <model id="segfault" substanceUnits="mole" timeUnits="second" volumeUnits="litre" lengthUnits="metre" extentUnits="mole">
    <listOfCompartments>
      <compartment id="c" spatialDimensions="3" units="litre" constant="true" size="1" multi:isType="false"/>
    </listOfCompartments>
<!--    <multi:listOfSpeciesTypes>
          <multi:speciesType multi:id="st" multi:name="st">
        <multi:listOfSpeciesFeatureTypes>
          <multi:speciesFeatureType multi:id="sft" multi:occur="1">
            <multi:listOfPossibleSpeciesFeatureValues>
              <multi:possibleSpeciesFeatureValue multi:id="psfv1"/>
              <multi:possibleSpeciesFeatureValue multi:id="psfv2"/>
            </multi:listOfPossibleSpeciesFeatureValues>
          </multi:speciesFeatureType>
        </multi:listOfSpeciesFeatureTypes>
      </multi:speciesType>
      </multi:listOfSpeciesTypes>
-->
    <listOfSpecies>
      <species id="s" compartment="c" initialConcentration="0" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false" multi:speciesType="st">
        <multi:listOfSpeciesFeatures>
          <multi:speciesFeature multi:speciesFeatureType="sft" multi:occur="1">
            <multi:listOfSpeciesFeatureValues>
              <multi:speciesFeatureValue multi:value="psfv1"/>
            </multi:listOfSpeciesFeatureValues>
          </multi:speciesFeature>
        </multi:listOfSpeciesFeatures>
      </species>
    </listOfSpecies>
    </model>
</sbml>
"""

org_sbml_doc = libsbml.SBMLReader().readSBMLFromString(model)
sbml_doc = org_sbml_doc.clone()
sbml_doc.validateSBML() # <-- segfault

for i_error in range(sbml_doc.getNumErrors()):
    error = sbml_doc.getError(i_error)
    print(f'{error.getCategoryAsString()} ({error.getSeverityAsString()}): {error.getMessage()}')

assert sbml_doc.getNumErrors() == 0
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff4d61710 in SBase::getParentSBMLObject() const () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
(gdb) bt
#0  0x00007ffff4d61710 in SBase::getParentSBMLObject() const () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#1  0x00007ffff4ad8677 in VConstraintSpeciesFeatureValueMultiSpeFtrVal_ValAtt_Ref::check_(Model const&, SpeciesFeatureValue const&) ()
   from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#2  0x00007ffff4adb619 in MultiValidatingVisitor::visit(SBase const&) () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#3  0x00007ffff4ab1c19 in SpeciesFeature::accept(SBMLVisitor&) const () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#4  0x00007ffff4a93653 in MultiSpeciesPlugin::accept(SBMLVisitor&) const () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#5  0x00007ffff4ada109 in MultiValidator::validate(SBMLDocument const&) () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#6  0x00007ffff4a8e8d3 in MultiSBMLDocumentPlugin::checkConsistency() () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#7  0x00007ffff4d37b99 in SBMLDocument::validateSBML() () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so
#8  0x00007ffff4542396 in _wrap_SBMLDocument_validateSBML () from /lib/python3.11/site-packages/libsbml/_libsbml.cpython-311-x86_64-linux-gnu.so