Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
5 of 24 tasks
artbear opened this issue Apr 18, 2020 · 5 comments · May be fixed by #2814
Open
5 of 24 tasks

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

artbear opened this issue Apr 18, 2020 · 5 comments · May be fixed by #2814
Assignees
Labels
component/diagnostics Доработка / создание диагностики

Comments

@artbear
Copy link
Contributor

artbear commented Apr 18, 2020

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

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

  • 0 простая повторная переустановка значения - реализовано в ПР
Значение = 1;
Значение = 2;

или похожий кейс из #178

МояПеременная = СтрЗаменить(КакаятоПеременная);
МояПеременная = СтрЗаменить(КакаятоДругаяПеременная);
  • 1 во вложенных циклах используется одна и та же переменная цикла
Для Счетчик = 0 По 10 Цикл
	Для Счетчик = 2 По 10 Цикл
		Для Счетчик = 0 По 10 Цикл
		
		КонецЦикла; 
	КонецЦикла; 
КонецЦикла; 

или

Для Каждого Элемент Из Коллекция1  Цикл
	Для Каждого Элемент Из Коллекция2  Цикл
		Для Каждого Элемент Из Коллекция3  Цикл
		
		КонецЦикла; 
	КонецЦикла; 
КонецЦикла; 
var Field;

procedure proc1 ()
    set = new Array ();
    for each Field in set do
        Message ( Field );
        proc2 ();
    enddo;
endprocedure

procedure proc2 ()
    Message ( Field );
endprocedure
новЗначение = 5;
Если НекотороеУсловие Тогда
    новЗначение = 10;
Иначе
    новЗначение = 20;
КонецЕсли;
  • 4 переменные, которые использовались, установлены снова, но далее не используются
Для Каждого Элем Из Коллекция Цикл
  ИД = 10;
  Элем.Реквизит = ИД;
  ИД = 20; // не используется или потеряна !
КонецЦикла;
  • Есть небольшое пересечение с "Неиспользуемая локальная переменная" Неиспользуемая локальная переменная #920

  • также нужно учесть не только переменные, но и изменение реквизитов объектов - но это сложно и могут быть ФП, т.к. реквизит может быть переиспользован в методах, куда передается сам объект

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

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

Параметры диагностики

Тип Статья на русском

  • 🐜 Ошибка
  • 👮 Уязвимость
  • 💂‍♂️ Потенциальная уязвимость
  • 💩 Качество кода
  • :trollface: Другое

Важность Статья на русском

  • 💔 Блокирующая / Blocker
  • ❤️ Критическая / Critical
  • 💛 Важная / Major
  • 💙 Незначительная / Minor
  • 💚 Информационная / Info
  • 💞 Другое

Тэги Статья на русском

  • STANDARD - "Нарушение стандартов 1С"
  • LOCKINOS - "Не будет работать в другой ОС"
  • SQL - "Проблема с запросом"
  • PERFORMANCE - "Проблема производительности"
  • BRAINOVERLOAD - "Непонятный код"
  • BADPRACTICE - "Плохая практика программирования"
  • CLUMSY - "Излишние действия"
  • DESIGN - "Ошибка в проектировании"
  • SUSPICIOUS - "Подозрительный код"
  • UNPREDICTABLE - "Непредсказуемо работающий код"
  • DEPRECATED - "Устаревшая функциональность"
  • ERROR - "Ошибочная конструкция"
  • LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

2 минуты

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

@artbear artbear added the component/diagnostics Доработка / создание диагностики label Apr 18, 2020
@theshadowco
Copy link
Member

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

@artbear
Copy link
Contributor Author

artbear commented May 7, 2020

Добавил в п.0 похожий кейс из #178

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

@artbear
Copy link
Contributor Author

artbear commented Dec 16, 2020

Добавил

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

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

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

@artbear
Copy link
Contributor Author

artbear commented Jun 17, 2022

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

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

@artbear
Copy link
Contributor Author

artbear commented Jun 17, 2022

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component/diagnostics Доработка / создание диагностики
Projects
None yet
2 participants