Uploaded image for project: 'Qt for Python'
  1. Qt for Python
  2. PYSIDE-1529

default value triggers crash when it requires a custom converter

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P3: Somewhat important
    • 5.15.4
    • 5.15.2
    • Shiboken
    • None
    • af1bdd8447771728321984f87447187f0284db6b (pyside/pyside-setup/dev) 49c115b88d9175c7c160e81d11450c6d42029b5f (pyside/tqtc-pyside-setup/5.15) 66f60a96e3d84c6a4ea897726632dce48482104b (pyside/pyside-setup/6.0)

    Description

      I haven't yet figured out how to reproduce this in a minimal testcase, but I would like to report what I'm seeing already:

      We have this struct:

      struct LabelNucleiParameters
      {
          std::optional<double> fixedThreshold = DEFAULT_FIXED_THRESHOLD;
          static constexpr std::optional<double> DEFAULT_FIXED_THRESHOLD = std::nullopt;
      };
      

      and then these snippets in our typesystems

      
          <container-type name="std::optional" type="pair">
             <include file-name="optional" location="global"/>
             <conversion-rule>
                 <native-to-target>
                      if (static_cast&lt;bool&gt;(%in))
                      {
                          %INTYPE_0 value = *%in;
                          return %CONVERTTOPYTHON[%INTYPE_0](value);
                      }
                      else
                          Py_RETURN_NONE;
                 </native-to-target>
                 <target-to-native>
                     <add-conversion type="PyObject*">
                     if (!%in)
                         %out = {};
                     else
                     {
                          %OUTTYPE_0 value = %CONVERTTOCPP[%OUTTYPE_0](%in);
                          %out = value;
                     }
                     </add-conversion>
                 </target-to-native>
             </conversion-rule>
          </container-type>
      
          <value-type name="LabelNucleiParameters">
      

      shiboken then crashes on startup with this backtrace:

      ==147691==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000010 (pc 0x7fd8f2c07490 bp 0x7ffd78550e00 sp 0x7ffd78550df0 T0)
      ==147691==The signal is caused by a READ memory access.
      ==147691==Hint: address points to the zero page.
          #0 0x7fd8f2c07490 in CopyCppToPython ../3rdParty/PySide2/sources/shiboken2/libshiboken/sbkconverter.cpp:226
          #1 0x7fd8f2c07554 in Shiboken::Conversions::copyToPython(SbkConverter const*, void const*) ../3rdParty/PySide2/sources/shiboken2/libshiboken/sbkconverter.cpp:239
          #2 0x7fd8aea7afe6 in init_Pipeline_LabelNucleiParameters(_object*) Python/KDAB/pipeline/PyQiTissue/Pipeline/pipeline_labelnucleiparameters_wrapper.cpp:550
          #3 0x7fd8aea1111f in PyInit_Pipeline Python/KDAB/pipeline/PyQiTissue/Pipeline/pipeline_module_wrapper.cpp:1746
          #4 0x7fd8f302ed2f  (/usr/lib/libpython3.9.so.1.0+0x216d2f)
          #5 0x7fd8f2f5333e  (/usr/lib/libpython3.9.so.1.0+0x13b33e)
          #6 0x7fd8f2f473d9 in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x12f3d9)
          #7 0x7fd8f2f409ac  (/usr/lib/libpython3.9.so.1.0+0x1289ac)
          #8 0x7fd8f2f52b0d in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13ab0d)
          #9 0x7fd8f2f4651d in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x12e51d)
          #10 0x7fd8f2f52969 in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13a969)
          #11 0x7fd8f2f4210a in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x12a10a)
          #12 0x7fd8f2f52969 in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13a969)
          #13 0x7fd8f2f41ed6 in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x129ed6)
          #14 0x7fd8f2f52969 in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13a969)
          #15 0x7fd8f2f41ed6 in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x129ed6)
          #16 0x7fd8f2f52969 in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13a969)
          #17 0x7fd8f2f41ed6 in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x129ed6)
          #18 0x7fd8f2f52969 in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13a969)
          #19 0x7fd8f2f52164  (/usr/lib/libpython3.9.so.1.0+0x13a164)
          #20 0x7fd8f2f664ba in _PyObject_CallMethodIdObjArgs (/usr/lib/libpython3.9.so.1.0+0x14e4ba)
          #21 0x7fd8f2f65ba4 in PyImport_ImportModuleLevelObject (/usr/lib/libpython3.9.so.1.0+0x14dba4)
          #22 0x7fd8f2f89877  (/usr/lib/libpython3.9.so.1.0+0x171877)
          #23 0x7fd8f2f64a42  (/usr/lib/libpython3.9.so.1.0+0x14ca42)
          #24 0x7fd8f2f6398e in PyObject_Call (/usr/lib/libpython3.9.so.1.0+0x14b98e)
          #25 0x7fd8f2f473d9 in _PyEval_EvalFrameDefault (/usr/lib/libpython3.9.so.1.0+0x12f3d9)
          #26 0x7fd8f2f409ac  (/usr/lib/libpython3.9.so.1.0+0x1289ac)
          #27 0x7fd8f2f52b0d in _PyFunction_Vectorcall (/usr/lib/libpython3.9.so.1.0+0x13ab0d)
          #28 0x7fd8f2f895b9 in PyObject_CallFunction (/usr/lib/libpython3.9.so.1.0+0x1715b9)
          #29 0x7fd8f2f88151 in PyImport_Import (/usr/lib/libpython3.9.so.1.0+0x170151)
          #30 0x7fd8f300f3cc in PyImport_ImportModule (/usr/lib/libpython3.9.so.1.0+0x1f73cc)
          #31 0x7fd8f2c1382f in Shiboken::Module::import(char const*) ../3rdParty/PySide2/sources/shiboken2/libshiboken/sbkmodule.cpp:67
          #32 0x7fd8b027b07a in PyInit_QiTissue Python/KDAB/qitissue/PyQiTissue/QiTissue/qitissue_module_wrapper.cpp:2445
      

      the reason is that in line 2445 of the module_wrapper the converters are not yet initialized, i.e. here's a snippet from qitissue_module_wrapper.cpp:

          {
              Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PyQiTissue.Pipeline"));
              if (requiredModule.isNull())
                  return SBK_MODULE_INIT_ERROR;
              SbkPyQiTissue_PipelineTypes = Shiboken::Module::getTypes(requiredModule);
              SbkPyQiTissue_PipelineTypeConverters = Shiboken::Module::getTypeConverters(requiredModule);
          }
      

      Line 2445 is the line with the Module::import call. That then down the line tries to access the converter in pipeline_labelnucleiparameters_wrapper.cpp line 550:

          PyDict_SetItemString(reinterpret_cast<PyTypeObject *>(Sbk_Pipeline_LabelNucleiParameters_TypeF())->tp_dict, "DEFAULT_FIXED_THRESHOLD", Shiboken::Conversions::copyToPython(SbkPyQiTissue_PipelineTypeConverters[SBK_PIPELINE_STD_OPTIONAL_DOUBLE_IDX], &Pipeline::LabelNucleiParameters::DEFAULT_FIXED_THRESHOLD));
      

      but the SbkPyQiTissue_PipelineTypeConverters is not yet initialized and thus returns a nullptr, leading to the crash in copyToPython.

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            kleint Friedemann Kleint
            milianw Milian Wolff
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes