Статический анализатор кода 1С на Си

30.06.23

Разработка - Языки и среды

Написание статического анализатора для 1С традиционным способом на Си.

 

c_static_analyzer_1c

Здравствуйте!

Я, как и многие люди, которые только научились чему-то новому, но не довели свой навык до совершенства спешу поделиться этим со всем миром!

Представляю начальную бета-версию статического анализатора кода (в перспективе) для 1С, написанной на чистом Си (не C++).

Имеется так же tutorial в папке с одноименным названием в корне этого проекта (обучающий материал, инструкция, которая по шагам описывает процесс и рассказывает, как достичь конкретного результата), который поможет новичкам влиться в разработку.

tutorial продублирован ниже.

Я считаю, что это несправедливо, что для 1С написано так мало статических анализаторов, почти все на Java (насколько я хорошо анализировал интернет) и 1 на C++ (не для групповой разработки).

Изначально планировал сделать автоматический отлов разыменования ссылок, на чем пока и остановился. На этой стадии разработки сделал копию всего проекта в папку tutorial. Пришла идея сделать копию, чтобы будущие поколения, заинтересованные этим проектом, смогли посмотреть, как все было изначально в первой версии и могли поэкспериментировать с этим кодом. В папке tutorial, я все файлы на Си прокомментировал построчно, чтобы люди, только начавшие изучения языка легко могли понять всю работу кода. При комментировании я увидел несколько недочетов, которые указал в подсказках к tutorial, и не стал их исправлять там (исправил только в самом проекте).

При изучении темы компиляторов я увидел, что современные ЯП такие как Go имеют те же инструменты для создания компиляторов/трансляторов/анализаторов, а именно генераторы кода. В приведенном списке литературы и документации, при прочтении можно увидеть, что генератор кода re2c, который я использую работает и для Go, а генератор синтаксических анализаторов bison отсутствует, но есть специально сделанный для Go goyacc. Поэтому будет здорово, если кто-то будет изучать Go и сделает статический анализатор для 1С в качестве своего пет-проекта.

Более подробная информация на GitHub (ссылка приведена в начале статьи).

Если, считаешь, что не зря потратил время и проект интересный - ставьте звезду на GitHub!

 

TUTORIAL

Содержит первую версию статического анализатора кода 1С с 1 проверкой на разыменование поля, полученного из выборки.
Все написано на чистом C, в файлах идет построчное комментирование кода, для тех, кто только начинает изучать Си. Я решил, что лучшее, что может быть для вступления в проект - это увидеть первоначальную версию с полным и подробнейшим ее описанием.

Необходимая литература

  • Брайан Керниган, Д.Ритчи "Язык программирования Си (читать все)
  • Alfred V. Aho "Компиляторы" (читать до 5 главы включительно)
  • Генератор лексических анализаторов re2c (читать все)
  • Генератор синтаксических анализаторов bison (читать все)

Содержимое файлов

  • lex.l - содержит описание правил формирования лексического анализатора re2c (формат называется Lex)
  • syn.y - содержит описание правил формирования синтаксического анализатора bison(формат называется YACC)
  • main.h - заголовочный файл, используемый везде, в нем описаны общие функции и глобальные переменные
  • main.c - основной файл, в котором реализованы функции по работе с хэш-таблицами, проверки кода, в общем там все что делается вручную.

С чего начать

Если вы не знаете языка Си, то нужно прочитать первую книгу обязательно, прежде чем что-либо дальше читать.

Далее, чтобы понять содержимое файлов lex.l и syn.y - вам нужно прочитать 2 документации по генераторам кода (лексического и синтаксического).

Если вы не знаете, что такое представляют эти генераторы кода в теории, то вам нужно прочитать до 5-й главы включительно книгу по компиляторам. Там примеры кода на Java, но все там относится к механизмам для Си (Lex и YACC).
т.к. Lex и YACC уже устарели, но принципы остались прежними, их заменили re2c и bison(есть и другие, но я использовал эти)

Платформа

Я писал код в Linux Ubuntu и тестировал тоже в ней.
Для windows адаптации не делал(не умею и нет пока времени). Все необходимые тесты и проверки запускают с помощью команды make.
Это программа, которая считывает содержимое файла Makefile и на основании параметров запуска делает те или иные действия.
Это традиционная команда сборки программ на Си, тем более что она максимально простая(информации в интернете полно)
Можно запускать make прямо из каталога tutorial и будет происходить сборка проекта. Удаление генерируемых файлов осуществляется командой make clean(это можно увидеть в самом Makefile)
Проверки на качество кода и утечки памяти запускаются программами, которые доступны в Linux Ubuntu(как их установить и запустить написано на главной странице проекта в файле README.md)

Подсказки

При построчном описании tutorial, я увидел 4 ошибки:

  1. При вызове destroy_lex не все глобальные переменные сбрасываются на значения по умолчанию
  2. Отсутствует грамматика в файле syn.y, которая бы анализировала конструкции вида:
    Переменная1 = Неопределено;
    Я намеренно не стал исправлять ошибки, чтобы при прочтении tutorial можно было практиковаться.
  3. Отсутствует грамматика для массивов
  4. Отсутствует грамматика остатка от деления **'%' **

Удобно запустать тесты в лог файл, например так:
make >log 2>log
>log обозначает, что обычные сообщения отправлять в файл с именем log(если его нет, то он создастся)
2>log обозначает, что сообщения об ошибках отправлять в файл с именем log(если его нет, то он создастся)

статический анализатор код C

См. также

Как вызвать скрипты на python в 1С по технологии NativeAPI

Языки и среды Платформа 1С v8.3 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    1752    YA_418728146    11    

54

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    10003    ROk_dev    67    

41

(Не) Строгая типизация 1С

Языки и среды Платформа 1С v8.3 Бесплатно (free)

Существует множество языков программирования, и каждый имеет свои особенности по работе с типами данных. Слабые, явные, динамические и другие... Но кто же здесь 1С и почему с приходом "строгой" типизации EDT 1С-программистам стоит задуматься над изменением своих привычек.

16.01.2024    4669    SeiOkami    21    

55

Простое приложение на Dart

Языки и среды Бесплатно (free)

Пример небольшого приложения, с которого можно начать изучать язык программирования Dart.

08.08.2023    3408    acvatoris    6    

14

Сквозная задача на Исполнителе - часть первая (IMAP)

Языки и среды Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    1960    0    kembrik    2    

7

1С# - Расширяем код 1С кодом на C#

Языки и среды Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Вставки кода на C# внутри кода на 1С.

7 стартмани

07.04.2023    9520    4    SerVer1C    56    

43

Независимая разработка совместимых компонент на ORM 1С – миф или истина где-то в аннотациях Java?

Языки и среды Платформа 1С v8.3 Бесплатно (free)

При работе с 1С ORM (object relation mapping) все время преследует ощущение постоянного создания монолитного приложения — один раз привязался к какой либо сущности (например, справочник Контрагенты), и весь код заполнен ссылками на эту конкретную реализацию. Можно ли независимо разрабатывать в ORM совместимые между собой справочник «Контрагентов» и использующий его документ «Платежное поручение», но при этом избежать жестких зависимостей? Спасут ли нас микросервисы? Пример на аннотациях Java демонстрирует, как это возможно делать.

13.03.2023    1078    1CUnlimited    0    

2

xPath в 1С

Файловый обмен (TXT, XML, DBF), FTP Языки и среды Платформа 1С v8.3 Бесплатно (free)

Опыт работы методами языка xPath в 1С.

04.03.2023    5064    DemetrKlim    40    

46
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Evil Beaver 8121 30.06.23 08:27 Сейчас в теме
Добрый день. Не хватает главного: описания того, а что же, всё-таки, оно делает? Что умеет и для чего её нужно скачать? А так - прикольно
корум; brr; info1i; +3 Ответить
2. prohorp 33 30.06.23 08:31 Сейчас в теме
(1)
а что же, всё-таки, оно делает
Здравствуйте, она делает статический анализ кода (из названия видно). Умеет пока что только вот это (взял из статьи): Изначально планировал сделать автоматический отлов разыменования ссылок (когда ссылки полученных из запроса разыменуются - выдется ошибка), на чем пока и остановился. Еще есть туториал, в котором можно практиковаться и учиться дорабатывать проект. Основная разработка ведется в корне проекта, а tutorial чисто для обучения и для истории (там первая версия этого проекта). Ключевое в статье это получить навыки программирования на Си на проекте для 1С, ведь это делается исключительно для аудитории 1сников. Призыв к коллективной разработке.
3. Evil Beaver 8121 30.06.23 08:45 Сейчас в теме
(2) вы слышали про BSL LANGUAGE SERVER? Такие проверки было бы круто добавлять туда, так ими сразу могут начать пользоваться массово люди. Это я не критикую, ни в коем случае, изучать компиляторы и анализаторы это почетно и похвально, все супер. Я хотел просто подсветить практическую сторону дела
5. prohorp 33 30.06.23 08:53 Сейчас в теме
(3)
BSL LANGUAGE SERVER
Да спасибо, слышал, но он написал на Java, а тут чистая Си. А так получилось, что я изучаю Си, а не Java)
4. so-quest 140 30.06.23 08:48 Сейчас в теме
Глянь https://tree-sitter.github.io/tree-sitter/
Чистый С + хорошее представление кода + нормальная поддержка для сторонних утилит
ktb; kuntashov; prohorp; +3 Ответить
6. prohorp 33 30.06.23 09:58 Сейчас в теме
(4)Вот это полезная информация, большое спасибо!
7. prohorp 33 01.07.23 18:58 Сейчас в теме
(4)по tree-sitter Посмотрел вводную информацию на сайте + в интернете погуглил.
Описание там такое:
Он может создавать конкретное синтаксическое дерево для исходного файла и эффективно обновлять синтаксическое дерево по мере редактирования исходного файла.

Все таки этот парсер подходит для редакторов, чтобы в режиме онлайн быстро перестраивать синтаксическое дерево. Bison же подходит именно для полного быстрого парсинга и используется повсеместно. Но спасибо за ссылку, не слышал даже про такой продукт.
8. so-quest 140 02.07.23 07:19 Сейчас в теме
Тебе нужно просто получить ast. Каким образом ты его получишь - не особо важно. С flex/bison ты попадаешь на неадекватно сложное представление грамматики. Если не зашел tree, глянь в peg/leg. Есть unicc - удобная штука (но опять же для 1с будет неадекватно сложная грамматика)
9. prohorp 33 02.07.23 07:58 Сейчас в теме
10. so-quest 140 02.07.23 10:00 Сейчас в теме
(9) начнешь когда делать - скинь ссылку на репозиторий. Интересно посмотреть на твою реализацию.
Ну и за re2c отдельно плюс. Терпеливый ты
11. prohorp 33 07.07.23 13:17 Сейчас в теме
(10)re2c обрабатывает только латиницу и символы, русские буквы я там не обрабатываю, т.к. при генерации кода через re2c 2 тысячи строк кода генерируется если искать кирилицу. Я русские зарезервированные слова ищу через хэш-таблицу, а re2c у меня все подобное как ID определяет. Так что терпеливости у меня тут нет)
12. so-quest 140 08.07.23 09:00 Сейчас в теме
(11) Зря ты так сделал. Придется потом переделывать. Хотя работа с юникодом - та еще боль
Глянь в сторону ragel - там попроще, плюс есть неплохая дока и примеры
13. prohorp 33 08.07.23 12:56 Сейчас в теме
14. bakmistoff1977 31 15.07.23 10:39 Сейчас в теме
Ещё один проект на чистом C! И это замечательно. Я-то думал, что я чуть ли не первопроходец в использовании C.
Фирма 1С, по моему мнению, планирует переход на новую версию языка - 1С:Предприятие.Элемент. Не запоздали ли вы с анализатором языка 1С 8? Может, лучше сразу анализатор для 1С:Предприятие.Элемент делать?
15. prohorp 33 20.07.23 08:13 Сейчас в теме
(14)Ну пока что 1С 8, если все получится(сделать минимальный набор проверок), то в будущем можно и 1С:Предприятие.Элемент анализировать(но я с ним пока не знаком)
Оставьте свое сообщение