Назначение инструмента
Программа предназначена для статического анализа модулей встроенного языка 1С (файлов *.bsl).
Зачем это нужно? Применение статического анализа при разработке позволяет сократить количество ошибок, выявляемых на этапе работы и сократить время, затрачиваемое на отладку за счёт выявления этих ошибок на этапе разработки.
В ходе работы проверяется в первую очередь корректность программы на встроенном языке (несколько строже, чем сам 1С), а так же ищутся ошибки в конструкциях программы, которые являются синтаксически правильными, но при этом содержат смысловые ошибки (см. список проверяемых ошибок ниже).
Возможности
Позволяет выполнить проверку файлов на наличие ошибок в интерактивном или пакетном режиме работы.
В интерактивном режиме предоставляется возможности:
- загрузки и проверки файла на наличие ошибок с учётом задаваемых констант компиляции
- отображения списка ошибок и переход из него к месту ошибки в редактируемом файле
- загрузки файла для редактирования
- сохранения файла
- при запуске программы открывается последний редактируемый файл
В пакетном режиме предоставляется возможность проверки одного или нескольких файлов с учётом определённых констант препроцессора и вывод сообщений об ошибках в файл протокола
Запуск в пакетном режиме
bslsa.exe pathToLogFile [ --define=DEFINE [...]] pathToFileToCheck1 [... pathToFileToCheckN]
где:
pathToLogFile - путь к файлу протокола
--define=DEFINE - определение требуемого символа препроцессора, например Клиент или Сервер
pathToFileToCheck1 - путь к файлу или файлам, которые требуется проверить
Пример строки запуска в пакетном режиме
bslsa.exe c:\check.log --define=Клиент --define=Сервер d:\cfgunload\*.bsl
Планы по развитию
В перспективе планируется:
- реализовать возможность проверять файлы не как отдельные единицы, но как часть конфигурации
- реализовать выбор набора правил для анализа
- расширить набор правил анализа
- улучшить работу с протоколом ошибок (сортировка, отбор и т.д.)
- улучшить редактор (раскраска текста и поиск по файлу)
Ошибки и предложения
https://trello.com/b/mwACzUl2/estatico-analisis
Распознаваемые ошибки
- Две последовательные переменные присваиваются через одно и то же выражение, что может являться логической ошибкой или неоптимизированным кодом.
- Не все ветви выполнения в функции %1 возвращают какое-либо значение, что похоже на ошибку.
- В функции ИМЯ отсутствует завершающий оператор ВОЗВРАТ (или ВЫЗВАТЬИСКЛЮЧЕНИЕ) что похоже на ошибку.
- Результат вызова функции '%1' не используется, что может являться ошибкой.
- Функция ИМЯ возвращает одно и тоже значение ЗНАЧЕНИЕ во всех точках возврата, что похоже на ошибку.
- Операторы функции ИМЯ1 полностью совпадают с операторами функции ИМЯ2.
- Возможно конструкция A[B ОПЕРАТОР C] ошибочна и нужна была A[B] ОПЕРАТОР C.
- Функция СтрДлина вызывается в цикле для константного выражения, что может сказываться на производительности.
- В выражении используется неинициализированная локальная переменная %1, что похоже на ошибку.
- Создаваемая переменная ИМЯ имеет тоже имя что и процедура, что может привести к ошибкам.
- Переменная ИМЯ присваивается дважды подряд без её использования между присваиваниями, что похоже на ошибку.
- Переменной ИМЯ присвоено значение, но оно нигде не используется, что похоже на ошибку.
- Переменная ИМЯ имеет имя одинаковое с глобальной переменной, что может привести к ошибкам.
- Переменная %1 переопределяет одноимённый параметр.
- Инструкция ПРОДОЛЖИТЬ является последней в цикле. Она либо является лишней, либо это похоже на ошибку кодирования.
- Отсутствуют какие-либо операторы внутри блока (ЦИКЛ|ЕСЛИ). Возможно это ошибка кодирования.
- Переменная ИМЯ используется для счётчика цикла и в этом и внешнем цикле, что похоже на ошибку кодирования.
- Этот и внешний циклы ДЛЯ КАЖДОГО реализуют обход по одной и той же коллекции %1, что может быть ошибкой.
- Начальное и конечное значение цикла совпадают, что похоже на ошибку кодирования.
- Безусловная операция ВОЗВРАТ внутри цикла. Это может указывать на логическую ошибку.
- Недостижимый код.
- Оператор ? вне зависимости от условия возвращает одинаковые значения.
- Присвоение переменной ИМЯ самой себе похоже на ошибку кодирования.
- Рекурсивная проверка ЕСЛИ (%1) ТОГДА ЕСЛИ (%1) ... похожа на ошибку кодирования, так как условие уже проверено выше.
- Обнаружены два взаимоисключающих условия (%1) и (%2). Второе условие всегда будет ложным.
- Последний оператор ВОЗВРАТ в ветке ТОГДА|ИНАЧЕТОГДА|ИНАЧЕ идентичен оператору ВОЗВРАТ следующему после оператора ЕСЛИ. Похоже, что он не нужен или присутствует ошибка.
- В первом из двух последовательных операторов ЕСЛИ с одинаковыми условиями содержится безусловный оператор ВОЗВРАТ. Второй оператор ЕСЛИ либо не нужен, либо его условие записано с ошибкой.
- Конструкция ЕСЛИ (%1) ТОГДА ... ИНАЧЕ ЕСЛИ (%1) ... похожа на ошибку кодирования, так как оно никогда не будет выполнено.
- Операторы в блоке ТОГДА полностью эквивалентны операторам в блоке ИНАЧЕ.
- Выражение (%1) окружено бесполезными скобками. Может быть они не нужны или присутствует ошибка
- Одинаковые выражения '%2' слева и справа от оператора '%1'. Возможно это ошибка кодирования.