bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

[NEW] Затираемая\скрываемая переменная - shadow variable

Open artbear opened this issue 5 years ago • 5 comments

Описание проблемы, ошибки, которую надо диагностировать

Возможные сценарии:

  • 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 минуты

Дополнительная информация

artbear avatar Apr 18 '20 17:04 artbear

4 тэга нельзя, максимум 3 :)

theshadowco avatar Apr 22 '20 07:04 theshadowco

Добавил в п.0 похожий кейс из https://github.com/1c-syntax/bsl-language-server/issues/178

МояПеременная = СтрЗаменить(КакаятоПеременная);
МояПеременная = СтрЗаменить(КакаятоДругаяПеременная);

artbear avatar May 07 '20 11:05 artbear

Добавил

  • также нужно учесть не только переменные, но и изменение реквизитов объектов
ЗаказКлиента.ДатаНачалаДействияАбонемента =  ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементС,  "Дата");        
ЗаказКлиента.ДатаНачалаДействияАбонемента =  ПривестиСтрокуКТипу(ДанныеЗаказа.АбонементПО, "Дата");
  • в последнем примере сработала ошибка последней строки

буквально полчаса назад нарвались на такую ошибку в коде )

ЗЫ что-то с подсветкой бсл-кода беда (

artbear avatar Dec 16 '20 10:12 artbear

Добавил кейс 4 переменные, которые использовались, установлены снова, но далее не используются

Для Каждого Элем Из Коллекция Цикл
  ИД = 10;
  Элем.Реквизит = ИД;
  ИД = 20; // не используется или потеряна !
КонецЦикла;

artbear avatar Jun 17 '22 14:06 artbear

@theshadowco @nixel2007 поставьте на меня, я правило реализовал, осталось шлифовка

  • в нашем Сонаре оно уже работает несколько дней.

artbear avatar Jun 17 '22 14:06 artbear