Как защититься в IOS от EXC_BAD_ACCESS в рекурсивном алгоритме

Я пытаюсь выполнить некоторые симуляции и математические операции, которые являются сильно рекурсивными, и в некоторых крайних случаях я переполняю стек вызовов и получаю сигнал EXC_BAD_ACCESS. Невозможно изменить алгоритмы на итеративную форму, поскольку это много устаревшего кода. И ограничение глубины рекурсии было бы бесполезным, потому что использование памяти недетерминировано.

Есть ли способ определить количество доступного стека, чтобы я мог изящно отменить операцию?

Можно ли реализовать тип Stack Canary, который я могу постоянно проверять, не переопределен?


person Armando    schedule 02.12.2011    source источник
comment
Вы уже разобрались с этим, потому что у меня такая же проблема, и я не знаю, как ее решить.   -  person Levi    schedule 24.04.2013


Ответы (1)


Если потокобезопасность не имеет значения, используйте статическую переменную. Что-то вроде этого:

int recurse(int something) {
  static int depth = 0;
  ++depth;
  if (depth > MAX_DEPTH) { // bail }

  ...
  int result = recurse(...);
  --depth;
  return result;
}

Если важна безопасность потоков, вы можете передать depth в качестве параметра.

person Rob Napier    schedule 02.12.2011