Просмотр полной версии : [Вопрос] Выполнение невозможного кода
XrenoTeHb
02.06.2021, 15:17
Есть некий мод. В нем есть некий код. Собсна ближе к проблеме, есть некоторые условия, допустим:
Где-то там в моде есть переменная test которая равна 0. Имеем следующее условие:
if(test) { ... }
Собсна вопрос, каким образом может проходить данное условие? Если переменная не равна 1 и выше.
Из особенностей - использование YSI.
- - - Добавлено - - -
Переменная test представлена в виде двухмерного массива.
if(test)
Данное условие равносильно
if(test != 0)
XrenoTeHb
02.06.2021, 19:40
if(test)
Данное условие равносильно
if(test != 0)
Без экспертов знаем чему это равносильно. Вопрос вообще в другом, а именно: почему проходит условие вида:
new test = 0;
if(test) { // этот код выполнится }
А, не так понял суть вопроса.
Так ты значение проверяемой переменной логировал?
XrenoTeHb
02.06.2021, 19:56
А, не так понял суть вопроса.
Так ты значение проверяемой переменной логировал?
Да, там 0, проверка должна пройти при любом положительном, но оно все равно проходит.
Ну с тем, что ты дал в теме, вряд ли тебе кто-то сможет помочь.
Как минимум, стоит дать реальный код, в котором имеется проблема. А ещё лучше - взять чистую сборку сервера и воссоздать проблему там, а после скинуть на форум архив с получившимся модом.
XrenoTeHb
02.06.2021, 20:10
Ну с тем, что ты дал в теме, вряд ли тебе кто-то сможет помочь.
Как минимум, стоит дать реальный код, в котором имеется проблема. А ещё лучше - взять чистую сборку сервера и воссоздать проблему там, а после скинуть на форум архив с получившимся модом.
Вряд ли получится дать мод. Мне хотя бы приблизительное направление куда копать. Сам проверял что мог, вроде все ок.
Для начала попробуй обновить YSI до последней версии.
Если не поможет - как и говорил, вырезать проблемный код в чистый мод и посмотреть, будет ли и там воспроизводиться проблема.
Если не будет, то, во-первых, внимательно перепроверить весь код, связанный с массивом (на случай каких-то собственных ошибок, которые мимо глаз пропустил), а, во-вторых, сделать бэкап мода и начать отрубать один за другим сторонние инклуды, комментируя весь код, который зависим от них. Собственно, так ты сможешь локализовать проблему.
Ну и я всё ещё советую тебе хотя бы скрин реального кода предоставить, ибо с таким описанием тебе остаётся только надеяться на то, что кто-то уже сталкивался с подобным (но лично я, например, не припомню случаев, когда кто-то о подобном писал).
Daniel_Cortez
03.06.2021, 10:32
Добавлю свои 10 копеек:
Откомпилируй скрипт в отладочном режиме (в pawn.cfg добавить параметры "-d2" и "-O0") и подключи к серверу плагин CrashDetect. Если имеет место выход за пределы массива, плагин поможет найти проблемное место.
Если вышеописанное не помогает, попробуй прологировать значение переенной внутри if, т.е.
if (test)
{
printf("test: %d", test);
}
Если выведенное значение меньше 256 и является кодом символа в ASCII, то следует смотреть на использование строковых функций. Суть в том, что если указать строковой функции неправильный размер целевого массива, можно легко получить выход за его пределы, который даже никаким крашдетектом не отловишь - потому и нужно вручную выверять места использования таких функций.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot