Segfault during validateSBML after SBMLDocument::clone() with SBML-multi
dweindl opened this issue · comments
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
- This seems to be related to the absence of the speciesType (no segfault when adding back the commented-out speciesType)
- No segfault when removing
multi:listOfSpeciesFeatures
- python-libsbml-5.20.0 does not segfault, but validation does not complain about the missing (but referenced) speciesType