PDA

Просмотр полной версии : [Вопрос] Выполнение невозможного кода



XrenoTeHb
02.06.2021, 15:17
Есть некий мод. В нем есть некий код. Собсна ближе к проблеме, есть некоторые условия, допустим:
Где-то там в моде есть переменная test которая равна 0. Имеем следующее условие:
if(test) { ... }
Собсна вопрос, каким образом может проходить данное условие? Если переменная не равна 1 и выше.
Из особенностей - использование YSI.

- - - Добавлено - - -

Переменная test представлена в виде двухмерного массива.

DeimoS
02.06.2021, 18:54
if(test)
Данное условие равносильно
if(test != 0)

XrenoTeHb
02.06.2021, 19:40
if(test)
Данное условие равносильно
if(test != 0)

Без экспертов знаем чему это равносильно. Вопрос вообще в другом, а именно: почему проходит условие вида:
new test = 0;
if(test) { // этот код выполнится }

DeimoS
02.06.2021, 19:51
А, не так понял суть вопроса.

Так ты значение проверяемой переменной логировал?

XrenoTeHb
02.06.2021, 19:56
А, не так понял суть вопроса.

Так ты значение проверяемой переменной логировал?

Да, там 0, проверка должна пройти при любом положительном, но оно все равно проходит.

DeimoS
02.06.2021, 20:01
Ну с тем, что ты дал в теме, вряд ли тебе кто-то сможет помочь.
Как минимум, стоит дать реальный код, в котором имеется проблема. А ещё лучше - взять чистую сборку сервера и воссоздать проблему там, а после скинуть на форум архив с получившимся модом.

XrenoTeHb
02.06.2021, 20:10
Ну с тем, что ты дал в теме, вряд ли тебе кто-то сможет помочь.
Как минимум, стоит дать реальный код, в котором имеется проблема. А ещё лучше - взять чистую сборку сервера и воссоздать проблему там, а после скинуть на форум архив с получившимся модом.

Вряд ли получится дать мод. Мне хотя бы приблизительное направление куда копать. Сам проверял что мог, вроде все ок.

DeimoS
02.06.2021, 20:19
Для начала попробуй обновить YSI до последней версии.

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

Если не будет, то, во-первых, внимательно перепроверить весь код, связанный с массивом (на случай каких-то собственных ошибок, которые мимо глаз пропустил), а, во-вторых, сделать бэкап мода и начать отрубать один за другим сторонние инклуды, комментируя весь код, который зависим от них. Собственно, так ты сможешь локализовать проблему.

Ну и я всё ещё советую тебе хотя бы скрин реального кода предоставить, ибо с таким описанием тебе остаётся только надеяться на то, что кто-то уже сталкивался с подобным (но лично я, например, не припомню случаев, когда кто-то о подобном писал).

Daniel_Cortez
03.06.2021, 10:32
Добавлю свои 10 копеек:
Откомпилируй скрипт в отладочном режиме (в pawn.cfg добавить параметры "-d2" и "-O0") и подключи к серверу плагин CrashDetect. Если имеет место выход за пределы массива, плагин поможет найти проблемное место.
Если вышеописанное не помогает, попробуй прологировать значение переенной внутри if, т.е.

if (test)
{
printf("test: %d", test);
}

Если выведенное значение меньше 256 и является кодом символа в ASCII, то следует смотреть на использование строковых функций. Суть в том, что если указать строковой функции неправильный размер целевого массива, можно легко получить выход за его пределы, который даже никаким крашдетектом не отловишь - потому и нужно вручную выверять места использования таких функций.