Skip to content

Segmentation faults in curious Python consoles #148

@tyralla

Description

@tyralla

Executing the following statements within, e.g., Pycharm's Python Console results in a segfault:

from hydpy.models.hland_96 import *
parameterstep()  # Process finished with exit code -1073741819 (0xC0000005)

The reason is that Pycharm tries to find information about Cython-level arrays that have not been initialised. Hence, our current workaround is to play around in Pycharm's Python Console only in the pure Python mode:

from hydpy import pub
pub.options.usecython = False
from hydpy.models.hland_96 import *
parameterstep()  # no problem

We could avoid this problem by activating Cython's initializedcheck option when compiling the models. However, this would increase simulation time by a few percent. Hence, we thought about just discussing this problem in the online documentation, but it would be clearly better if we could solve it without losing performance.

Here is a toy example:

class A:
    @property
    def p(self):
        sys.exit(666)

a = A() 
a.  # Process finished with exit code 666

Making p private (_p) or "special" (__p__) does not help. But removing p from the dir results fixes the problem:

import sys

class A:
    @property
    def f(self):
        sys.exit(9)
    def __dir__(self):
        return [n for n in super().__dir__() if n != "f"]

a = A()
a.  # no problem

I hope 99% of all potentially uninitialised arrays are hidden behind a fastaccess attribute. Hence, we could either remove fastaccess from the __dir__ methods of classes that define a fastaccess attribute (at best, only when working in Cython mode). Or, we could remove the potentially problematic arrays (or just everything) from the __dir__ method of all FastAccess classes (at best, only from the Cython extension classes).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions