Инструментальный код, вызывающий бесконечный цикл рекурсии - PullRequest
1 голос
/ 16 марта 2020

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

  • Вся кодовая база C ++ оснащается clang во время сборки, используя проход LLVM, который ищет llvm.memcpy встроенные функции и вставка пост-вызова в среду выполнения инструментария
  • Среда выполнения инструментария содержит структуру std::map
  • Базовый код libc ++, который реализует std::map, инструментирован и, в свою очередь, вызывает снова выполнение инструментария

Когда я запускаю программу, она останавливается после первого вызова инструментария. Подозреваемый l oop - это trace_memcpy> std::map::operator[]> trace_memcpy> и т. Д.

Есть ли способ замкнуть это l oop, например, может ли библиотека приборов проверить вызов стек, чтобы увидеть, что это уже в , вызов стека и ранний возврат из функции trace_memcpy?

Спасибо:)

1 Ответ

1 голос
/ 16 марта 2020

Быстро и грязно и, вероятно, не пуленепробиваемо - добавьте переменную static к реализации trace_memcpy, чтобы избежать вложения.

void trace_memcpy(void)
{
    static int nested;
    if (nested)
    {
        return;
    }

    nested = 1;

    // whatever your actual trace logic is

    nested = 0;
}

Если вам нужно что-то более сложное, используйте соответствующий объект параллелизма как предоставляется вашей системой.

...