Связан с варнингом const корректности
PHP код:
warning 239: literal array/string passed to a non-const parameter
Вид для печати
Всегда присваивал значение ячейке массива с помощью встроенной функции, если это касалось string значения. Что не так я делаю?
"Неофициальный" релиз 3.10.10+ от 31.06.2020.
Скачать: https://www.dropbox.com/s/v5gvuwi0s2...0.10x.zip?dl=1
Исходный код: https://github.com/Daniel-Cortez/paw...e/master-fixes
В данном билде вы можете ознакомиться как с улучшениями для уже представленных ранее варнингов (204, 240), так и с новыми диагностиками, которые могут помочь в нахождении скрытых ошибок в вашем коде:
- (FIX) Исправлен баг, из-за которого элементы перечислений при использовании в качестве индекса элемента массива замещали своим тегом тег ячейки массива (отдельное спасибо пользователю tnc за то, что сообщил об этом баге).
- (FIX) Для варнингов 204 и 240 (неиспользуемые присвоения к переменным) реализован гораздо более изощрённый механизм отслеживания присвоений, благодаря чему компилятор теперь умеет находить неиспользуемый код в более сложных случаях.
- (NEW) warning 241: negative or too big shift count - отрицательный или слишком большой счётчик битового сдвига.
Теперь если счётчик битового сдвига (2-й операнд в операциях "<<", ">>" и ">>>") отрицательный или больше 31, такая операция сдвига считается подозрительной, т.к. в ячейке всего 32 бита.
Эта диагностика может быть особенно полезна, если пользователь пытается уместить слишком много битовых флагов в одной переменной.
enum ePlayerFlags { pfEmailConfirmed, // 0 pfTutorialCompleted, // 1 /* ... */ // ... pfImprisoned, // 31 pfHospitalized // 32, флаг не сохранится, т.к. при сдвиге на 32 позиции влево // он окажется "вытолкнут" из ячейки (переполнение) }; // ... player_info[playerid][pFlags] |= (1 << pfHospitalized); // warning 24X: negative or too big shift count- (NEW) warning 242: shift overflow in enum item declaration (symbol "%s") - переполнение при левом сдвиге в объявлении одного из членов перечисления.
Тоже выявляет случаи, когда пользователь объявил слишком много битовых флагов, но только в самих перечислениях, если пользователь указал в качестве инкремента левый битовый сдвиг.
enum ePlayerFlags (<<= 1) { /* 1 << 0 */ pfEmailConfirmed = 1, /* 1 << 1 */ pfTutorialCompleted, /* ... */ /* 1 << 31 */ pfImprisoned, /* 1 << 32 */ pfHospitalized // переполнение };
В приведённом выше примере значение константы pfHospitalized на самом деле рассчитывается не как (1 << 32), а как (pfImprisoned << 1) (т.е. на основе значения предыдущего члена перечисления), поэтому в таком случае предупреждение о неправильном счётчике сдвига (warning 241) было бы неверным, т.к. у счётчика на самом деле правильное значение (1). Тем не менее, при расчёте значения константы происходит переполнение, поэтому для таких случаев и был сделан отдельный варнинг.
- (NEW) warning 243: redundant code: switch control expression is constant - излишний код: контрольное выражение внутри switch является константным.
Подобные варнинги уже действуют при использовании константы или константного выражения в if, while, do-while и for ("redundant code: constant expression is zero", "redundant test: constant expression is non-zero"), поэтому логично иметь подобного рода диагностику и для switch.
На данный момент мне известно только об одном ложном срабатывании в инклудах amx_assembly, просьба о нём не сообщать! Насколько я понимаю, это особый случай нестандартного использования switch (самомодифицирующийся код?), и я предложу в репозиторий amx_assembly исправление, как только варнинг примут в состав компилятора.
- (NEW) warning 244: enum item "%s" not handled in switch - для одного или нескольких членов перечисления не предусмотрен(ы) case внутри switch, а также нет ветки default.
enum EFamily { FAM_GROVE, FAM_BALLAS, FAM_VAGOS, FAM_AZTECAS }; stock GetFamilyColor(EFamily:family) { switch (family) { // ПРИМЕЧАНИЕ: пользователь забыл добавить case для FAM_AZTECAS case FAM_GROVE: return COLOR_GREEN; case FAM_BALLAS: return COLOR_PURPLE; case FAM_VAGOS: return COLOR_YELLOW; } // warning 244: enum item "FAM_AZTECAS" not handled in switch return COLOR_GREY; }
P.S.: Не стесняйтесь сообщать сюда о ложных срабатываниях варнингов, если таковые вдруг будут, либо же просто отписываться об интересных скрытых недочётах, которые вы смогли найти благодаря новым диагностикам, ибо лишняя аргументация за принятие варнингов в состав компилятора точно не помешает :)
Как минимум, 213-ое предупреждение для switch крайне полезным оказалось, так что советую всем с этим компилятором свои скрипты проверить.
Сейчас скинули мод вместе с заказом и там была система прикрепления объектов к скинам с разными координатами для разных ID. И было такое перечисление:
Собственно, обычный компилятор такой код пропустит без проблем. Но если внимательно присмотреться, в нескольких местех вместо запятой стоит точка.Код:switch(skin)
{
/*прочие case*/
case 9,11,12,13,40.41,55,56,63,64,65,69,75,76,85,89,90,91,92,93,131,138,139,140,141,145.148,150,151,152,157,169,172,178,190,191,192,193,194,198,201,209,210,211,214,215,216,219,224.225,226,229,230,233,237,238,244,246,251,256,257,263,306,307,308,309: /*прикрепление объекта*/
/*прочие case*/
}
switch(skin) { /*прочие case*/ case 9,11,12,13,40.41,55,56,63,64,65,69,75,76,85,89,90,91,92,93,131,138,139,140,141,145.148,150,151,152,157,169,172,178,190,191,192,193,194,198,201,209,210,211,214,215,216,219,224.225,226,229,230,233,237,238,244,246,251,256,257,263,306,307,308,309: /*прикрепление объекта*/ /*прочие case*/ }
Соответственно, ни о какой правильной работоспособности и речи тут не идёт. И глазом такую ошибку не с первого раза обнаружишь.
"Неофициальный" релиз 3.10.10+ от 02.07.2020 (hotfix).
В данном релизе исправлены ложные срабатывания варнингов 204 и 240, при которых выводились случайные (неправильные) номера строк, например:
pawno\include\functions.inc(758132272) : warning 204: symbol is assigned a value that is never used: "playerid"
Если с предыдущим билдом от 30.06.2020 у вас были подобные сообщения - крайне рекомендуется использовать этот билд.
Скачать: https://www.dropbox.com/s/v5gvuwi0s2...0.10x.zip?dl=1
Модифицированные инклуды SA-MP: https://github.com/pawn-lang/samp-st...3.7-R2-1-1.zip
Исходный код: https://github.com/Daniel-Cortez/paw...e/master-fixes
Полный список изменений (с момента предыдущего билда от 30.06.2020):
- Исправлен баг с локальными константами, продолжающими существовать после окончания локального блока, внутри которого они были объявлены.
main() { if (/* ... */) { const CONSTVAL = 0; } return CONSTVAL; // Из-за бага такой код компилировался, хотя по идее константа CONSTVAL // должна была перестать существовать после окончания блока "if". }- Исправлены ложные срабатывания варнингов 204 и 240 в случаях, когда внутри if или switch объявлена локальная константа (отдельное спасибо DeimoS'у за то, что сообщил о проблеме).
Причиной оказался упомянутый пунктом выше баг с областью существования констант, из-за которого ломался алгоритм отслеживания присвоений.
Кхм, использую последний релиз компилятора, получаю 239 варинг, при использовании диалога. Собственно скрин варинга - https://prnt.sc/te6t10
скрин диалога - https://prnt.sc/te6tp8
UPD: на все функции которые содержат "text[]" и т.д. получаем 239 вар, закрадываются сомнение в правильном работоспособности, ибо это ж дефолтные функции, теперь необходимо к каждой функции дописывать const.... :sad:
Начиная с версии 3.10.10 с компилятором требуется использовать модифицированные инклуды SA-MP, в которых исправлена проблема с const-корректностью и множество других недочётов.
Подробнее о const-корректности: https://pro-pawn.ru/showthread.php?16434