Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Текстовая трансляция CppCast 298: Инстр…

Текстовая трансляция CppCast 298: Инструменты анализа SonarSource

04 Июл 2021
Автор:

Эпизод 298 CppCast вышел 5 мая 2021 года. В этом выпуске Роб Ирвинг и Джейсон Тернер беседуют с Лоиком Жоли об инструментах статического анализа SonarSource. Кроме того, они обсудят Visual Studio 2019 STL, обновление компилятора GCC 11.1 и результаты опроса C++.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image1.png

Спонсор данного эпизода – C++ Builder, многофункциональная среда разработки C++ приложений для Windows, позволяющая создавать приложения в 5 раз быстрее с меньшим количеством кода. Инструмент обеспечивает поддержку на протяжении всего жизненного цикла разработки для создания единой базы исходного кода. Все это возможно благодаря усовершенствованному компилятору на базе Clang, Dinkum, STL и библиотекам Boost и SDL 2 в C++ Builder's Package Manager и многому другому. Быстрая интеграция с конфигурациями непрерывной сборки с поддержкой проектов MSBuild, CMake и Ninja для индивидуальных разработчиков или целой команды. Доступ к 20 базам данных, таким как MariaDB, Oracle, SQL Server, Postgres и многим другим с высокоскоростным прямым доступом через Firedocs. Основное преимущество C++ Builder – это его фреймворки, многофункциональные библиотеки, открывающие большие возможности, чем другие C++ инструменты. Доступно использование удостоенного награды фреймворка VCL для высокопроизводительных приложений Windows и мощный фреймворк FireMonkey для кросс-платформенных iOS. Попробуйте последнюю версию на embarcadero.com.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image2.png

Введение

Роб: Добро пожаловать на 298 выпуск CppCast! Сегодня у нас в гостях Лоик Жоли, C++ программист, докладчик, преподаватель и профессионал. Он представляет Францию в комитете по стандартизации ISO C++, а также является членом комитета, разрабатывающего следующую версию стандарта MISRA C++ для систем с повышенными требованиями к безопасности. Помимо кодинга на C++, увлекается преподаванием IT и делится своим опытом с коллегами. Часто выступает на встречах и конференциях и преподает в Telecom SudParis. После того, как он присоединился к SonarSource в 2018 году, он занимался разработкой статического анализа для C++, составляя правила, помогающие другим разработчикам и получая удовольствие от их реализации.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image3.png

Фичи VS 2019 STL для C++20

Роб: Итак, начнем с коротких новостей. Давайте обсудим Visual Studio 2019 16.10, который, по-моему, уже вышел. Согласно их журналу изменений, в STL будет завершена реализация новых функций C++20, что довольно интересно.

Джейсон: Весьма иронично, что в std::format есть баг. Его часть случайно полагается на <locale>. Std::format не должен зависеть от <locale>. Фактически они хотят быстро исправить это в С++20. Но Microsoft уже пообещали обеспечить совместимость ABI с их стандартной библиотекой. Так что, если они хотят исправить это в стандартной Visual Studio, они не смогут это сделать, им все равно придется сначала избавиться от <locale> зависимости.

Лоик Жоли: Мне кажется немного странным фокусироваться на полной поддержке библиотеки. Что действительно важно для меня, так это поддержка на протяжении всего жизненного цикла разработки. Уверен, что это большой шаг вперед. Я в предвкушении.

Джейсон: Они достаточно близки к тому, чтобы осуществить это.

Релиз GCC 11.1

Роб: Итак, теперь обсудим обновление GCC 11.1.

Роб: Разработчики объявили о релизе компилятора, а также о том, что он поддерживает C++20. Теперь версия языка по умолчанию будет C++17, что очень здорово. Они уточнили, насколько далеко они продвинулись с поддержкой С++20, или они просто рассказали о прогрессе?

Джейсон: Я зашел на сайт Cpp reference, чтобы посмотреть на их версию диаграммы поддержки компилятора для C++20 GCC. Они утверждают, что согласовали все языковые особенности, кроме модулей. Что забавно, потому что Clang обычно развивается быстрее других. По диаграмме видно, что GCC и Visual Studio сильно опережают Clang по поддержке C++20.

Лоик Жоли: Я тоже заметил такую тенденцию. Меня это даже немного беспокоит, потому что это говорит о снижении темпов развития Clang. Раньше он был одним из первых по внедрению языковых особенностей. Я часто использую Clang.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image4.png

Clang – замечательный инструмент. Но то, что он отстает от Visual Studio и от GCC – плохой знак. В Clang сейчас практически ничего нет для модулей. Даже в GCC не согласовали модули, но все остальное готово.

Джейсон: Просматривая этот список сравнений, я обратил внимание на пункт лямбды в невычисляемом контексте. Кажется, что согласовать это просто, но для разработчиков библиотек это достаточно сложно. В Clang нет даже частичной поддержки этого.

Роб: Надеюсь, скоро они наверстают упущенное.

Результаты опроса Meeting C++: самые востребованные фичи С++

Роб: Meeting C++ опубликовали результаты опроса. Пользователи голосовали за самые востребованные фичи С++. Основатель Meeting С++, Дженс Веллер сравнил результаты прошлогоднего опроса с результатами опроса этого года. Некоторые фичи стали менее актуальными, но большинство из них довольно стабильно используются из года в год.

Джейсон: Я ожидал, что гистограммы изменятся за год, а они практически идентичны. Изменения вовсе не значительные. Кажется, в том году количество людей, заявивших, что они не используют C++14 было больше. Может, конечно, это просто были разные группы людей.

Роб: Или они просто перешли на 17.

Джейсон: А возможно они неправильно поняли вопрос и ответили, что не используют 14, а используют 17.

SonarSource: SonarLint, SonarQube и SonarCloud

Роб: Итак, Лоик, что вы расскажете нам об инструментах SonarSource?

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image5.png

Лоик Жоли: Мы занимаемся разработкой SonarLint, SonarQube и SonarCloud. SonarLint – это расширение для IDE. Еще у нас есть SonarQube и SonarCloud, в которых используется концепция непрерывной интеграции. Например, наши инструменты позволяют проводить анализ pull request-ов и блокировать pull request-ы, которые угрожают безопасности вашего кода. Также имеется возможность просмотреть историю изменений кода.

Наша цель – предоставить удобные инструменты, помогающие разработчикам на протяжении всего процесса разработки продукта.

Роб: Для каких IDE доступен SonarLint?

Лоик Жоли: Он доступен для различных IDE в зависимости от языка. Для C++ мы поддерживаем Visual Studio. Некоторые инструменты поддерживают CLion.

Джейсон: Вот интересно, для чего может потребоваться полный доступ к проекту?

Лоик Жоли: Например, чтобы определить неиспользуемые функции.

Джейсон: Интересно. Недавно, работая с одним из клиентов, я потратил неделю или около того, чтобы удалить около ста тысяч строк кода, которые не использовались. Производительность проекта значительно улучшилась.

Лоик Жоли: В С++ не так-то просто обнаружить то, что не используется. Это очень сложно, потому что есть некоторые функции, которые не используются, но удалять их не хочется.

Джейсон: Ваш инструмент умеет находить те функции, которые вообще не используются?

Лоик Жоли: Нет. Мы не предоставляем инструмент, анализирующий код. Наш инструмент выдает предупреждения и пытается объяснить, почему они появились. Он находит подозрительные места в коде, чтобы вы могли понять, откуда появилась ошибка, однако наш инструмент не позволяет редактировать вашу кодовую базу.

Роб: Для каких языков можно использовать SonarSource?

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image6.png

Лоик Жоли: По-моему, мы работаем с 27 языками, но основной язык – Java. Изначально мы работали только с Java. Поэтому наши продукты часто используются Java-программистами. Кроме того, у нас также есть инструменты для C#, Python, JavaScript, Apps Script. Вроде, я упомянул самые основные, а если и забыл какие-то, мои коллеги убьют меня завтра :).

Джейсон: По счастливой случайности, один из моих друзей только что поделился со мной багом, которую SonarQube обнаружил в его кодовой базе на C#. Этот баг было практически невозможно найти, но SonarQube справился.

Джейсон: SonarLint – это проект с открытым исходным кодом?

Лоик Жоли: Интеграция IDE имеет открытый исходный код, но ядро анализатора C++ – закрытый исходный код. Вообще, SonarLint – бесплатный инструмент. Его также можно использовать бесплатно, если используете SonarCloud в проектах с открытым исходным кодом. Но если хотите использовать SonarCloud в закрытом проекте или если нужно проанализировать C++ проект в SonarQube, вам придется заплатить.

Роб: Итак, есть ли какие-то конкретные типы ошибок, с которыми часто сталкиваются ваши инструменты анализа SonarSource?

Лоик Жоли: Мы работаем с различными типами ошибок по самым разным направлениям. У нас много преимуществ по сравнению с другими инструментами. Мы не только ищем ошибки, но и создаем правила.

Компиляторы выдают предупреждения только при угрозе того, что код не скомпилируется. А мы же стараемся выдавать предупреждения только в случаях, когда код плохо написан.

Это и отличает наши инструменты от других. Например, у нас есть такие правила, как правило пяти (rule of five) или правило ноля (rule of zero). Код может быть написан правильно и без этих правил, но читать код, написанный в соответствии с этими правилами, гораздо проще.

Джейсон: Интересно, есть ли у вас правила, с помощью которых можно обнаружить неправильное использование умных указателей (smart pointers)?

Лоик Жоли: Нет, боюсь, такого у нас нет.

Роб: Вы упомянули плагин Visual Studio, работает ли SonarSource на Windows, Linux и Mac?

Лоик Жоли: Ядро SonarSource работает на Windows, Linux и Mac iOS. SonarLint скорее подходит для индивидуального использования. В то время как SonarCloud и SonarQube больше для командного использования. То, на какой платформе работает SonarLint, зависит от языка. Например, для Java мы работаем в Eclipse и в VS Code. Я точно не могу сказать, какой язык поддерживаются в каких IDE. Но мы стараемся поддерживать основные системы.

Для SonarQube и SonarCloud у нас есть некоторые правила, которыми могут пользоваться все члены команды. Это правило будет работать при каждом pull request-е. А в SonarLint также есть то, что мы называем режимом подключения (connected mode). Если вы запускаете SonarQube или SonarCloud, вы можете синхронизироваться с SonarLint.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image7.png

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

Джейсон: Итак, вы сказали, что SonarCloud доступен для проектов с открытым исходным кодом, верно?

Лоик Жоли: SonarCloud можно использовать для открытых или закрытых проектов. Для открытых проектов его можно использовать без каких-либо ограничений. Если нужно настроить SonarCloud или SonarQube, потребуется приложить немного усилий, чтобы интегрировать SonarSource в вашу систему. Но это не займет много времени, нужно всего лишь добавить пару строк кода. У нас есть несколько кратких руководств для начала работы и несколько примеров проектов, которые пользователь может посмотреть.

Реализация правил

Роб: Итак, вы упомянули, что, работая с анализом стека, вы реализуете правила и помогаете другим разработчикам в этом. Как появляются новые правила для инструментов анализа SonarSource?

Лоик Жоли: Иногда это оказывается сложной задачей. Бывают правила, на реализацию которых уходит времени больше, чем на разработку. Это может показаться странным, но я даже опубликовал статью в блоге об одном из таких правил.

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

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

Мы черпаем вдохновение для разработки правил из опыта и новых версий стандартов. Так, недавно мы потратили некоторое время на изучение нового стандарта C++20, чтобы понять, получится ли создать новые правила.

Мы также ищем вдохновение в CppCoreGuidelines, но мы не можем напрямую реализовывать правила из CppCoreGuidelines. Часто CppCoreGuideline требует пользователя писать код определенным способом, что вовсе не типично для написания кода на C++.

Мы не просим пользователей писать код определенным образом, чтобы мы смогли правильно его анализировать. Наш инструмент – инструмент для всех С++ разработчиков. Мы работаем с уже написанным кодом.

У нас также есть MISRA – стандарт разработки программного обеспечения, используемый в основном в автомобильной промышленности для обеспечения безопасности. Когда мы внедряли MISRA, мы использовали официальную версию MISRA 2008. В то время это был совершенно другой C++. Сейчас мы обновляемся до C++17. Не знаю точно, когда это завершится, но мы стараемся создать правила, применимые в любой ситуации, потому что безопасность кода очень важна и требует особой осторожности. Некоторые правила могут быть универсальными. А некоторые из них, скорее всего, будут применяться исключительно для обеспечения безопасности ПО.

Роб: То есть, если использовать какой-либо из инструментов SonarSource в кодовой базе, можно выбрать между правилами MISRA, Core Guidelines и другими?

Лоик Жоли: У нас есть несколько флажков в правилах, поясняющих их происхождение. У нас есть возможность создавать разные наборы правил. У нас нет полного покрытия MISRA C++ 2008, но мы и не хотели полностью покрывать MISRA C++ 2008. Сейчас мы работаем со следующей версией MISRA. У нас есть один профиль качества (Quality Profile) – Sonar way. Он представляет собой набор правил, которые, по нашему мнению, являются универсальными.

Когда мы создаем правило, мы тестируем его на 30-50 проектах с открытым исходным кодом. Мы запускаем его в LibreOffice, в Clang и в ядре Linux. Мы тестируем его на многих крупных проектах с открытым исходным кодом и смотрим результаты.

Джейсон: Собираете ли вы статистику того, как часто люди выбирают игнорировать правило в SonarCloud? Бывает ли такое, что сто тысяч пользователей взяли и проигнорировали определенное правило, и вам пришлось разбираться, что с ним не так.

Лоик Жоли: Мы только начинаем собирать такого рода отзывы от пользователей. Сначала мы должны были убедиться, что это будет абсолютно конфиденциально. Нужно осторожно обращаться с такого рода информацией от пользователей. Мы приложили много усилий, чтобы обеспечить безопасность данных.

Джейсон: Это так захватывающе. Вот кажется, что тысячи программистов, проигнорировавшие правило, просто не могут ошибаться, а в итоге они оказываются абсолютно не правы!

Лоик Жоли: У нас проводился эксперимент по проверке ПО. Программное обеспечение должно было быть протестировано дважды и дважды запущено на двух разных компьютерах параллельно, просто чтобы убедиться в надежности системы. Командам, которые принимали в этом участие, было запрещено общаться между собой. Были случаи, когда они находили один и тот же баг в одном и том же месте.

Джейсон: Вау.

Роб: Вы упомянули про реализацию некоторых новых правил безопасности для C++, что это за правила?

Лоик Жоли: Одним из не самых сложных в разработке правил было использование memset_s для очистки памяти. Даже если кто-то получит доступ к памяти, он не сможет узнать пароль, находящийся там.

У нас также есть куча правил для POSIX-функций, которые в основном предназначены для C, потому что в C проще получить переполнение буфера, чем в C++. У нас есть много POSIX-функций для char*, для аргументов, буфера и определения его размера.

При работе с такими функциями невозможно сделать все идеально, но мы постоянно совершенствуемся. Кроме того, мы также хотим улучшить процесс нотификации пользователей о найденных проблемах. У нас есть правила, которые помогают обнаружить неправильное использование POSIX-функций, из-за которого может возникнуть переполнение буфера. Мы также отслеживаем неправильное использование API.

Джейсон: Круто! Такие правила и правда сложно реализовывать.

Лоик Жоли: Да. Возможно, когда мы реализуем все эти правила, я выйду на пенсию. На данный момент мы уже добились значительных результатов, но многие процессы все еще нуждаются в улучшении.

Джейсон: Вы сказали, что используете статический анализатор Clang для бэкенда. Получается, если я запущу свой проект в SonarCloud, он будет проверяться по правилам Clang-Tidy и по вашим правилам? Или только по вашим правилам?

Лоик Жоли: Наши правила основаны на правилах Clang, но мы не берем все из Clang IDE. Мы сами разрабатываем правила. Конечно, мы просматриваем все возможные источники, но мы не просто копипастим правила Clang IDE.

Джейсон: Если я получу предупреждение о нарушении правил от одного из ваших инструментов, откуда будет получена эта информация? Вы сказали, что многие ваши правила основаны на Core Guidelines. Мне любопытно, если я получу уведомление о нарушении правил, получу ли я документацию, объясняющую, почему так делать нельзя?

Лоик Жоли: Фактически, для каждого правила у нас есть документация, в которой мы пытаемся объяснить, почему существует то или иное правило. Также вы всегда можете найти примеры плохого кода и пример того, как переписать его так, чтобы он стал лучше. Если мы используем некоторые сторонние источники для создания правила, такие как CppCoreGuideline или MISRA, мы ссылаемся на них. Предупреждение относится к определенному месту в коде, но мы также стараемся указывать и другие места в коде, с помощью которых можно понять, почему было выдано это предупреждение.

Роб: Лоик, круто, что вы пришли сегодня к нам. Всю информацию о SonarSource можно найти на sonarsource.com. А как слушатели могут с вами связаться? Есть ли у вас аккаунт в Твиттере, блог или что-то в этом роде?

Лоик Жоли: Ну, я человек старой закалки. Не сижу в Твиттере. Но я написал несколько статей в блоге SonarSource. Со мной можно связываются только по почте. Вот знаете, в девяностые только так и общались. Почему бы не использовать почту и сегодня? :)

Роб: Хорошо, ссылки на все новости, а также ссылку на ваш блог, можно найти в описании подкаста. Спасибо, что пришел.

Лоик Жоли: Спасибо.

Большое спасибо, что прослушали нашу беседу о C++.

Мы хотим узнать, что вы думаете о подкасте. Пожалуйста, дайте нам знать, интересно ли то, что мы обсуждаем, а также не стесняйтесь предлагать новые темы для подкастов. Отправляйте отзывы на feedback@cppcast.com. Можете поставить CppCast лайк на Facebook или подписаться на наш Tвиттер. А также на наши аккаунты: @robirwing и Джейсона @lefticus в Twitter.

Мы также хотели бы поблагодарить всех наших спонсоров, которые поддерживают шоу через Patreon. Хотите поддержать CppCast на Patreon? Переходите по ссылке patreon.com/CppCast. Всю необходимую информацию можно найти в заметках к выпуску на сайте cppcast.com. Музыка для этого выпуска была предоставлена podcastthemes.com.

Ресурсы

Подкаст

Новости

Ссылки

Спонсоры

Примечание команды PVS-Studio

Хочется напомнить, что статический анализатор PVS-Studio можно интегрировать с SonarQube. В этом случае, PVS-Studio становится ещё одним источником данных об ошибках и потенциальных уязвимостей. SonarQube в свою очередь позволяет удобно, и что важно, единообразно, работать с предупреждениями, полученными от разных инструментов. См. раздел документации "Интеграция результатов анализа PVS-Studio в SonarQube" и мастер-класс "SonarQube: от установки до анализа production-кода".

Популярные статьи по теме
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22 Окт 2018

Автор: Андрей Карпов

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…

Комментарии (0)

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять