Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7
  1. #1
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±

    TDW RScan - сканер рекурсий

    TDW RScan
    Описание
    Многие, я думаю, замечали при компиляции около значения использования стека появляется сообщение, говорящее о том, что в скрипте находится рекурсия. Выявить её достаточно проблематично, поскольку необходимо проверять каждую вложенную функцию, что довольно долго. По этой причине и была разработана библиотека-сканер для поиска рекурсий в скрипте.

    Документация
    Как говорилось выше, основная функциональность библиотеки - поиск рекурсий. Библиотека проверяет все вложенные функции, а также функции вложенные во вложенные функции и т.д., пока не найдёт рекурсию. Количество уровней вложенности ограничено. Это делается для того, чтобы увеличить скорость работы сканера. Тем не менее библиотека представляет возможность изменить данное значение, определив макрос RSCAN_MAX_NESTED_LEVEL до включения библиотеки. Максимальное значение для уровня вложенности - 128. Значение по-умолчанию и рекомендуемое - 32.

    Название функции Описание
    RScan_Run Функция принимает необязательный параметр - адрес функции. Данная функция запускает и инициализирует сканер. Если был передан адрес, то функция запустит сканер только для этого адреса, т.е. другие функции не будут просканированы.
    PHP код:
    forward public func1();
    forward public func2();

    main() {
        
    RScan_Run();

        goto 
    ___avoid_recursion;  // избежать вызов рекурсии
        
    func1();
    ___avoid_recursion:

    }

    func1() {
        
    func2();
    }

    func2() {
        
    func1();

    addressofex Дополнительная функция для определения адреса абсолютно любой функции. Принимает вызов функции.
    PHP код:
    addressofex(somefunc(0,0)); 

    Библиотека имеет зависимость от amx_assembly, однако в скором времени я попытаюсь сделать её автономной.

    Скачать

    Установка
    1. Перейдите в репозиторий на github (ссылка выше).
    2. Для скачивания на открывшейся странице нажмите на кнопку "Clone or download" (зелёного цвета) и в открывшемся меню - "Download ZIP".
    3. Все файлы библиотеки перемести в папку '/pawno/includes/'.
    4. Скомпилировать изменённые вами скрипты.


    Автор: VVWVV
    Распространяется по лицензии ZLIB.

  2. 9 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (12.05.2017) Edwin (12.05.2017) Nash_Brigers (08.06.2017) Nexius_Tailer (12.05.2017) Nurick (12.05.2017) Osetin (20.05.2017) SooBad (12.05.2017) vasyok28 (12.05.2017) Web (12.05.2017)
  3. #2
    Аватар для SooBad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Полезно для тех, кто не использует модификатор от Zeex'a последних версий, аля там вшита возможная компиляция с ключом '-R', определяющая действующую рекурсию.
    Хотелось бы задать отдельный вопрос про адреса: крашей нет с этим, при невалидной передаче(зависимость от некоторых критичных инструкций же)? Возможности сейчас проверить просто нет.

  4. #3
    Аватар для Alpano
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.02.2017
    Сообщений
    123
    Репутация:
    16 ±
    Интересно)В Том же компиляторе by zeex, мне в консоль выдаёт:
    recursion detected: function 40000004!=40000004 indirectly calls itself:
    40000004!=40000004 <- ac_OnPlayerStateChange <- 40000004!=40000004
    recursion detected: function 40000004/0 directly calls itself
    recursion detected: function 40000004*0 indirectly calls itself:
    40000004*0 <- AntySH <- 40000004*0
    recursion detected: function -40000004 indirectly calls itself:
    -40000004 <- GetCoordBonnetVehicleEx <- ac_OnPlayerKeyStateChange <- -40000004
    Не будет ли такого же непонятного ответа от Вашего компилятора?) Или принцип поиска рекурсий идентичен?
    MyProject:
    DriftEmpire©

    Ленивые всё делают быстро, чтобы поскорее избавиться от работы.
    И делают качественно, чтобы потом не переделывать.

  5. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Alpano Посмотреть сообщение
    Интересно)В Том же компиляторе by zeex, мне в консоль выдаёт:
    Не будет ли такого же непонятного ответа от Вашего компилятора?) Или принцип поиска рекурсий идентичен?
    Нет, принцип работы совсем другой.

  6. #5
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    196
    Репутация:
    22 ±
    Шикарно
    Раньше поиском рекурсий занимался через компилятор от Трекера. Не сказал бы, что это сильно напряжно, но приходится сначала повозиться.

    UPD: А он будет отлавливать, к примеру, таймеры, которые вызывают сами себя?
    Последний раз редактировалось Edwin; 15.05.2017 в 01:15.

  7. #6
    Аватар для somebodies
    Пользователь

    Статус
    Оффлайн
    Регистрация
    03.01.2017
    Сообщений
    30
    Репутация:
    0 ±
    Приветствую. Получил такую строку.
    Код:
    recursion detected: function 4438552 indirectly calls itself
    Пробовал использовать функции из библиотеки amx_header по типу GetPublicNameFromIndex, однако не помогло. как получить имя public-функции?

  8. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от somebodies Посмотреть сообщение
    Приветствую. Получил такую строку.
    Код:
    recursion detected: function 4438552 indirectly calls itself
    Пробовал использовать функции из библиотеки amx_header по типу GetPublicNameFromIndex, однако не помогло. как получить имя public-функции?
    1) Выводится адрес функции, а не индекс.
    2) Если функция объявлена с помощью оператора public, то название этой функции будет и в сообщении. Для того чтобы зарегистрировать название функции необходимо написать:
    Код:
    forward public название_функции();
    Цитата Сообщение от Edwin Посмотреть сообщение
    UPD: А он будет отлавливать, к примеру, таймеры, которые вызывают сами себя?
    Нет, но в новой версии сделаю.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •