bsl-language-server
bsl-language-server copied to clipboard
[NEW] Затираемая\скрываемая переменная - shadow variable
Описание проблемы, ошибки, которую надо диагностировать
Возможные сценарии:
- 0 простая повторная переустановка значения - реализовано в ПР
Значение = 1;
Значение = 2;
или похожий кейс из https://github.com/1c-syntax/bsl-language-server/issues/178
МояПеременная = СтрЗаменить(КакаятоПеременная);
МояПеременная = СтрЗаменить(КакаятоДругаяПеременная);
- 1 во вложенных циклах используется одна и та же переменная цикла
Для Счетчик = 0 По 10 Цикл
Для Счетчик = 2 По 10 Цикл
Для Счетчик = 0 По 10 Цикл
КонецЦикла;
КонецЦикла;
КонецЦикла;
или
Для Каждого Элемент Из Коллекция1 Цикл
Для Каждого Элемент Из Коллекция2 Цикл
Для Каждого Элемент Из Коллекция3 Цикл
КонецЦикла;
КонецЦикла;
КонецЦикла;
- 2 из https://github.com/1c-syntax/bsl-language-server/issues/940
- неожиданно счетчик в цикле затирает переменную модуля [ ] нужно учесть циклы Для по; Для Каждого
var Field;
procedure proc1 ()
set = new Array ();
for each Field in set do
Message ( Field );
proc2 ();
enddo;
endprocedure
procedure proc2 ()
Message ( Field );
endprocedure
- 3 кейс из https://github.com/1c-syntax/bsl-language-server/issues/945
- во всех ветвлениях затирается значение переменной [ ] нужно учесть Если, ИначеЕсли; Попытка-Исключение;
новЗначение = 5;
Если НекотороеУсловие Тогда
новЗначение = 10;
Иначе
новЗначение = 20;
КонецЕсли;
- 4 переменные, которые использовались, установлены снова, но далее не используются
Для Каждого Элем Из Коллекция Цикл
ИД = 10;
Элем.Реквизит = ИД;
ИД = 20; // не используется или потеряна !
КонецЦикла;
-
Есть небольшое пересечение с "Неиспользуемая локальная переменная" #920
-
также нужно учесть не только переменные, но и изменение реквизитов объектов - но это сложно и могут быть ФП, т.к. реквизит может быть переиспользован в методах, куда передается сам объект
ЗаказКлиента.ДатаНачалаДействияАбонемента = ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементС, "Дата");
ЗаказКлиента.ДатаНачалаДействияАбонемента = ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементПО, "Дата");
-
в последнем примере сработала
ошибка последней строки -
Еще интересный кейс затирания\скрытия возможен в циклах в https://github.com/1c-syntax/bsl-language-server/issues/1522
Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы
Параметры диагностики
Тип Статья на русском
- [ ] :ant: Ошибка
- [ ] :cop: Уязвимость
- [ ] :guardsman: Потенциальная уязвимость
- [x] :poop: Качество кода
- [ ] :trollface: Другое
Важность Статья на русском
- [ ] :broken_heart: Блокирующая / Blocker
- [ ] :heart: Критическая / Critical
- [x] :yellow_heart: Важная / Major
- [ ] :blue_heart: Незначительная / Minor
- [ ] :green_heart: Информационная / Info
- [ ] :revolving_hearts: Другое
Тэги Статья на русском
- [ ]
STANDARD- "Нарушение стандартов 1С" - [ ]
LOCKINOS- "Не будет работать в другой ОС" - [ ]
SQL- "Проблема с запросом" - [ ]
PERFORMANCE- "Проблема производительности" - [ ]
BRAINOVERLOAD- "Непонятный код" - [x]
BADPRACTICE- "Плохая практика программирования" - [ ]
CLUMSY- "Излишние действия" - [ ]
DESIGN- "Ошибка в проектировании" - [x]
SUSPICIOUS- "Подозрительный код" - [x]
UNPREDICTABLE- "Непредсказуемо работающий код" - [ ]
DEPRECATED- "Устаревшая функциональность" - [ ]
ERROR- "Ошибочная конструкция" - [ ]
LOCALIZE- "Проблемы локализации"
Время на исправление (минут)
2 минуты
Дополнительная информация
4 тэга нельзя, максимум 3 :)
Добавил в п.0 похожий кейс из https://github.com/1c-syntax/bsl-language-server/issues/178
МояПеременная = СтрЗаменить(КакаятоПеременная);
МояПеременная = СтрЗаменить(КакаятоДругаяПеременная);
Добавил
- также нужно учесть не только переменные, но и изменение реквизитов объектов
ЗаказКлиента.ДатаНачалаДействияАбонемента = ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементС, "Дата");
ЗаказКлиента.ДатаНачалаДействияАбонемента = ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементПО, "Дата");
- в последнем примере сработала
ошибка последней строки
буквально полчаса назад нарвались на такую ошибку в коде )
ЗЫ что-то с подсветкой бсл-кода беда (
Добавил кейс 4 переменные, которые использовались, установлены снова, но далее не используются
Для Каждого Элем Из Коллекция Цикл
ИД = 10;
Элем.Реквизит = ИД;
ИД = 20; // не используется или потеряна !
КонецЦикла;
@theshadowco @nixel2007 поставьте на меня, я правило реализовал, осталось шлифовка
- в нашем Сонаре оно уже работает несколько дней.