как справиться со случайной ошибкой сегментации в модуле f2py

У меня есть модуль f2py, который я использую. Ядро кода я не писал сам, просто обертка f2py для его использования. Из-за нехватки времени и знания того, что его код является краткосрочным, это означает, что я хочу выбросить его, а не исправить, что я хочу сделать, так это просто поймать поведение, когда происходит segfault, и повторить попытку. Код ниже является примером:

sums.f90

subroutine bad(a, b, c)

  real, intent(in) :: a, b
  real, intent(out) :: c
  real, allocatable :: d(:)
  real :: r

  call random_number(r)

  if (r < 0.5) then
    print *, d(1)  ! segfault here
  end if

  c = a + b

end subroutine bad

скомпилировать с: f2py -c sums.f90 -m sums

и теперь, если я просто вызываю его несколько раз, то иногда он работает, а иногда нет.

>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
3.0
>>> python -c "import sums; print(sums.bad(1,2))"
Segmentation fault: 11

Теперь я знаю, что правильно было бы исправить segfault..., но я надеюсь, что есть способ, которым я могу просто справиться с этим и двигаться дальше из вызывающего кода Python. Это возможно?

--ТЕКУЩИЙ ПОДХОД-- Мое текущее решение состоит в том, чтобы запустить мою программу внутри подпроцесса, используя subprocess.run, и если код возврата указывает на segfault, попробуйте еще раз определенное количество раз, прежде чем сдаться. Я собираюсь оставить вопрос без ответа, поскольку это не совсем то, что я задавал изначально, а также, вероятно, не рекомендуемая практика, а просто то, что помогает мне справиться с моей текущей ситуацией.


person Vince W.    schedule 16.05.2020    source источник
comment
Вы хотите исправить это внутри, изменив сгенерированный код Python или изменив исходный код fortran?   -  person cup    schedule 16.05.2020
comment
Фортран не работает - вы обращаетесь к d( 1 ) до того, как d будет выделен. Таким образом, вам придется изменить fortran.   -  person Ian Bush    schedule 16.05.2020
comment
Хорошо, может быть, я понимаю, что вы хотите сейчас, вы хотите поймать segfault в питоне. Пожалуйста, поймите, что то, что вы сделали на стороне Fortran, вызвало неопределенное поведение. Таким образом, может случиться что угодно, включая правильные результаты, неправильные результаты, третью мировую войну и, если вам очень повезет, ошибка сегментации и файл ядра. Единственный разумный способ исправить такой случай — это исправить segfault, иначе результаты работы программы будут совершенно ненадежными.   -  person Ian Bush    schedule 16.05.2020
comment
@IanBush, я все понимаю. Происходит то, что я вызываю конкретную подпрограмму буквально 3 триллиона раз, и время от времени она у меня падает. Я мог бы потратить время на ее исправление... и я сделаю это, если придется, но я просто надеялся, что у меня есть способ не тратить это время на отладку, поскольку подпрограмма больше никогда не будет использоваться после того, как я сделано с этим здесь   -  person Vince W.    schedule 16.05.2020
comment
Боюсь, единственно правильное решение — отладить рутину.   -  person Ian Bush    schedule 16.05.2020