Skip to content

Commit d7bf106

Browse files
authored
Merge pull request #1854 from theshadowco/feature/dublicateLiteral
2 parents f6f2895 + c1f0a80 commit d7bf106

File tree

10 files changed

+636
-4
lines changed

10 files changed

+636
-4
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# Повторное использование строкового литерала (DuplicateStringLiteral)
2+
3+
| Тип | Поддерживаются<br>языки | Важность | Включена<br>по умолчанию | Время на<br>исправление (мин) | Теги |
4+
|:-------------:|:-----------------------------:|:----------------:|:------------------------------:|:-----------------------------------:|:-------------:|
5+
| `Дефект кода` | `BSL`<br>`OS` | `Незначительный` | `Да` | `1` | `badpractice` |
6+
7+
## Параметры
8+
9+
10+
| Имя | Тип | Описание | Значение<br>по умолчанию |
11+
|:---------------------:|:--------:|:------------------------------------------------------------------:|:------------------------------:|
12+
| `allowedNumberCopies` | `Целое` | `Допустимое количество повторов использования строкового литерала` | `2` |
13+
| `analyzeFile` | `Булево` | `Анализировать весь файл целиком` | `false` |
14+
| `caseSensitive` | `Булево` | `Учитывать регистр` | `false` |
15+
| `minTextLength` | `Целое` | `Минимальная длина строкового литерала (с кавычками)` | `5` |
16+
<!-- Блоки выше заполняются автоматически, не трогать -->
17+
## Описание диагностики
18+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
19+
20+
Многократное использование одинаковых строковых литералов в одном модуле или методе является плохим тоном, т.к.
21+
- оно может приводить к сложностям при дальнейшем сопровождении, когда необходимо изменить значение и высока вероятность пропустить одно из повторений
22+
- оно может быть следствием "копипасты", т.е. разработчик забыл изменить, после копирования похожего блока кода.
23+
24+
### Особенности реализации диагностики
25+
26+
- Диагностика с настройками по умолчанию не учитывает регистр символов литерала, т.о. считаются одинаковыми строки `АААА` и `АааА`.
27+
- Нельзя указать минимальное значение анализируемого литерала меньше, чем значение по умолчанию. Это обусловлено тем, что часто используются служебные литералы, которые будут сильно фонить. Например: пустая строка "", числа-селекторы "1", "0" и т.д.
28+
- Нельзя уменьшить допустимое количество повторов использования меньше 1, т.к. это не имеет практического смысла.
29+
30+
## Примеры
31+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
32+
33+
Плохой код
34+
35+
```bsl
36+
Процедура Тест(Параметр)
37+
Результат = "Значение";
38+
Если Параметр = "ВРег" Тогда
39+
Результат = Результат + ВРег("Значение");
40+
Иначе
41+
Результат = Результат + HРег("Значение");
42+
КонецЕсли;
43+
КонецПроцедуры
44+
```
45+
46+
Исправленный вариант
47+
48+
```bsl
49+
Процедура Тест(Параметр)
50+
Результат = "Значение";
51+
Если Параметр = "ВРег" Тогда
52+
Результат = Результат + ВРег(Результат);
53+
Иначе
54+
Результат = Результат + HРег(Результат);
55+
КонецЕсли;
56+
КонецПроцедуры
57+
```
58+
59+
Плохой код
60+
61+
```bsl
62+
Процедура Тест2(Параметр)
63+
Если Параметр = "ВРег" Тогда
64+
Результат = Результат + ВРег("Значение");
65+
Иначе
66+
Результат = Результат + HРег("Значение");
67+
КонецЕсли;
68+
КонецПроцедуры
69+
70+
Процедура Тест3(Параметр)
71+
Если Параметр = "СОКРЛП" Тогда
72+
Результат = Результат + СокрЛП("Значение");
73+
КонецЕсли;
74+
КонецПроцедуры
75+
```
76+
77+
Исправленный вариант
78+
79+
```bsl
80+
Процедура Тест2(Параметр)
81+
Если Параметр = "ВРег" Тогда
82+
Результат = Результат + ВРег(СтроковоеЗначение());
83+
Иначе
84+
Результат = Результат + HРег(СтроковоеЗначение());
85+
КонецЕсли;
86+
КонецПроцедуры
87+
88+
Процедура Тест3(Параметр)
89+
Если Параметр = "СОКРЛП" Тогда
90+
Результат = Результат + СокрЛП(СтроковоеЗначение());
91+
КонецЕсли;
92+
КонецПроцедуры
93+
94+
Функция СтроковоеЗначение()
95+
Возврат "Значение";
96+
КонецПроцедуры
97+
```
98+
99+
## Источники
100+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
101+
<!-- Примеры источников
102+
103+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
104+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
105+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
106+
107+
## Сниппеты
108+
109+
<!-- Блоки ниже заполняются автоматически, не трогать -->
110+
### Экранирование кода
111+
112+
```bsl
113+
// BSLLS:DuplicateStringLiteral-off
114+
// BSLLS:DuplicateStringLiteral-on
115+
```
116+
117+
### Параметр конфигурационного файла
118+
119+
```json
120+
"DuplicateStringLiteral": {
121+
"allowedNumberCopies": 2,
122+
"analyzeFile": false,
123+
"caseSensitive": false,
124+
"minTextLength": 5
125+
}
126+
```

docs/diagnostics/index.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88

99
## Список реализованных диагностик
1010

11-
Общее количество: **150**
11+
Общее количество: **151**
1212

1313
* Потенциальная уязвимость: **4**
1414
* Уязвимость: **4**
1515
* Ошибка: **48**
16-
* Дефект кода: **94**
16+
* Дефект кода: **95**
1717

1818

1919
| Ключ | Название | Включена по умолчанию | Важность | Тип | Тэги |
@@ -58,6 +58,7 @@
5858
[DeprecatedMethods8317](DeprecatedMethods8317.md) | Использование устаревших глобальных методов платформы 8.3.17 | Да | Информационный | Дефект кода | `deprecated`
5959
[DeprecatedTypeManagedForm](DeprecatedTypeManagedForm.md) | Устаревшее использование типа "УправляемаяФорма" | Да | Информационный | Дефект кода | `standard`<br>`deprecated`
6060
[DuplicateRegion](DuplicateRegion.md) | Повторяющиеся разделы модуля | Да | Информационный | Дефект кода | `standard`
61+
[DuplicateStringLiteral](DuplicateStringLiteral.md) | Повторное использование строкового литерала | Да | Незначительный | Дефект кода | `badpractice`
6162
[EmptyCodeBlock](EmptyCodeBlock.md) | Пустой блок кода | Да | Важный | Дефект кода | `badpractice`<br>`suspicious`
6263
[EmptyRegion](EmptyRegion.md) | Область не должна быть пустой | Да | Информационный | Дефект кода | `standard`
6364
[EmptyStatement](EmptyStatement.md) | Пустой оператор | Да | Информационный | Дефект кода | `badpractice`
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Duplicate string literal (DuplicateStringLiteral)
2+
3+
| Type | Scope | Severity | Activated<br>by default | Minutes<br>to fix | Tags |
4+
|:------------:|:-------------------:|:--------:|:-----------------------------:|:-----------------------:|:-------------:|
5+
| `Code smell` | `BSL`<br>`OS` | `Minor` | `Yes` | `1` | `badpractice` |
6+
7+
## Parameters
8+
9+
10+
| Name | Type | Description | Default value |
11+
|:---------------------:|:---------:|:---------------------------------------------:|:-------------:|
12+
| `allowedNumberCopies` | `Integer` | `Allowed number of copies string literals` | `2` |
13+
| `analyzeFile` | `Boolean` | `Analyze file` | `false` |
14+
| `caseSensitive` | `Boolean` | `Case sensitive` | `false` |
15+
| `minTextLength` | `Integer` | `Minimum length of a string literal (quoted)` | `5` |
16+
<!-- Блоки выше заполняются автоматически, не трогать -->
17+
## Description
18+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
19+
20+
## Examples
21+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
22+
23+
## Sources
24+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
25+
<!-- Примеры источников
26+
27+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
28+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
29+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
30+
31+
## Snippets
32+
33+
<!-- Блоки ниже заполняются автоматически, не трогать -->
34+
### Diagnostic ignorance in code
35+
36+
```bsl
37+
// BSLLS:DuplicateStringLiteral-off
38+
// BSLLS:DuplicateStringLiteral-on
39+
```
40+
41+
### Parameter for config
42+
43+
```json
44+
"DuplicateStringLiteral": {
45+
"allowedNumberCopies": 2,
46+
"analyzeFile": false,
47+
"caseSensitive": false,
48+
"minTextLength": 5
49+
}
50+
```

docs/en/diagnostics/index.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ To escape individual sections of code or files from triggering diagnostics, you
88

99
## Implemented diagnostics
1010

11-
Total: **150**
11+
Total: **151**
1212

1313
* Security Hotspot: **4**
1414
* Vulnerability: **4**
1515
* Error: **48**
16-
* Code smell: **94**
16+
* Code smell: **95**
1717

1818

1919
| Key | Name| Enabled by default | Severity | Type | Tags |
@@ -58,6 +58,7 @@ Total: **150**
5858
[DeprecatedMethods8317](DeprecatedMethods8317.md) | Using of deprecated platform 8.3.17 global methods | Yes | Info | Code smell | `deprecated`
5959
[DeprecatedTypeManagedForm](DeprecatedTypeManagedForm.md) | Deprecated ManagedForm type | Yes | Info | Code smell | `standard`<br>`deprecated`
6060
[DuplicateRegion](DuplicateRegion.md) | Duplicate regions | Yes | Info | Code smell | `standard`
61+
[DuplicateStringLiteral](DuplicateStringLiteral.md) | Duplicate string literal | Yes | Minor | Code smell | `badpractice`
6162
[EmptyCodeBlock](EmptyCodeBlock.md) | Empty code block | Yes | Major | Code smell | `badpractice`<br>`suspicious`
6263
[EmptyRegion](EmptyRegion.md) | The region should not be empty | Yes | Info | Code smell | `standard`
6364
[EmptyStatement](EmptyStatement.md) | Empty statement | Yes | Info | Code smell | `badpractice`

0 commit comments

Comments
 (0)