LINUX.ORG.RU

PVS-Studio для Linux

 , , ,


0

5

Появилась версия анализатора PVS-Studio, работающая в GNU/Linux. До этого программа работала только в Windows.

PVS-Studio — это инструмент для выявления ошибок в исходном коде программ, написанных на С и C++. В случае интеграции с Visual Studio также возможна проверка проектов на C#.

PVS-Studio выполняет широкий спектр проверок кода, но наиболее удачно справляется с поиском опечаток и последствий неудачного Copy-Paste. Показательные примеры таких ошибок: V501, V517, V522, V523, V3001.

Хочу поблагодарить всех, кто принял участие в Beta-тестировании и отправлял нам свои отзывы. Эти отзывы действительно были крайне полезны. Спасибо!

Пакеты PVS-Studio в форматах deb, rpm и tgz доступны для скачивания на официальном сайте.

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

Обязательно сразу же прочитайте краткую инструкцию «как запустить PVS-Studio в Linux».

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

Доклад на конференции C++ CoreHard Autumn 2016 «Что пришлось тестировать и о чем узнать при подготовке Linux-версии PVS-Studio».

Про что доклад: большинство программистов плохо представляют, что означает создание PVS-Studio для Linux. Многие думают, что вся сложность заключается в портировании кода, однако это очень далеко от истины: портировать код очень просто, но это только 5% работы. Остальная работа скрыта от стороннего наблюдателя и состоит в решении многих инфраструктурных вопросов. Предлагаем заглянуть на кухню разработчиков анализатора PVS-Studio и узнать разные интересные нюансы их работы.

>>> Подробности



Проверено: Aceler ()
Последнее исправление: cetjs2 (всего исправлений: 8)
Ответ на: комментарий от tailgunner

Я правильно понимаю, что просто триальной версии, не требующей общения с продажниками PVS, не предоставляется?

Пока только через общение.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от ASM

Ещё на заметку к документации, вы даёте http://www.viva64.com/ru/m/full/ Это удобно, но было бы ещё удобнее возможность скачать pdf файл с этой документацией.

PDF файл идёт в составе дистрибутива.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от anonymous

Когда конторка разорится, тогда всё выложат под GPLv3, как миленькие.

AGPL3 будет правильнее.

anonymous
()
Ответ на: комментарий от vada

Хорошая штука. Такие веселые ошибки выявляет!

Фраза хорошо сочетается с аватарой.

anonymous
()
Ответ на: комментарий от anonymous

«Всё верно. Только не Волгу, а 3 рубля. И не в лотерею, а в карты. И не выиграл, а проиграл.»

TheAnonymous ★★★★★
()
Ответ на: комментарий от anonymous

вранье

Художественное преувеличение.

PS: хотя странно, что на ЛОРе кто-то взял не поленился и пошёл проверять. Приятно удивило.

fornlr ★★★★★
()
Ответ на: комментарий от MuZHiK-2

От этой поделки никакой пользы сообществу.

Ты хочешь чтобы тонны быдлокода более менее квалифицированные люди разбирали?

ados ★★★★★
()
Ответ на: комментарий от ados

Ты хочешь чтобы тонны быдлокода более менее квалифицированные люди разбирали?

Я хочу, чтобы на сообществе не только паразитировали в наглую.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

Тогда сразу сноси линукс с десктопа.

anonymous
()
Ответ на: комментарий от fornlr

Олсо подписплся на Карпова в твиттере. Очень интересно, рекомендую.

Я вот тоже как-то подписался, но недолго выдержал его поток спамообразной субстанции, в котором что-то интересное бывает скорее как исключение. Таки спам у них в крови.

На него еще и Кармак как-то ссылался там, в твиттере. Что-то типа «я Rust не видел, но вон там написано почему он кака, а я этим чувакам доверяю». С такими друзьями врагов не надо :(

anonymous
()
Ответ на: комментарий от Andrey_Karpov_2009

посмотрел примеров 50, не увидел. но спорить не хочу, разу кому-то надо то ок. нормальный компилятор сам производит такой простой статический анализ.

pseudo-cat ★★★
()
Ответ на: комментарий от pseudo-cat

посмотрел примеров 50, не увидел. но спорить не хочу, разу кому-то надо то ок. нормальный компилятор сам производит такой простой статический анализ.

Если всё так просто, то откуда эти 10000 ошибок?

Да и то, что мы легко находим ошибки в компиляторах, как бы намекает. :)

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от pseudo-cat

поиском опечаток и последствий неудачного Copy-Paste

ну надеюсь вы не про это

Начинайте мне рассказывать, что вот это в коде GCC не последствия Copy-Paste, а диверсия инопланетян:

return (   !strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1)
        && !strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1));

А вот этот Copy-Paste в коде Clang я сам туда вписал из вредности :)

MapTy PerPtrTopDown;
MapTy PerPtrBottomUp;

void clearBottomUpPointers() {
  PerPtrTopDown.clear();
}

void clearTopDownPointers() {
  PerPtrTopDown.clear();
}
Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

бог маркетинга )

  1. добавить в проект копипаст с ошибкой
  2. проверить код проекта
  3. найти ошибку в копипасте
  4. профит...

:-D

anonymous
()
Ответ на: комментарий от Andrey_Karpov_2009

А вот этот Copy-Paste в коде Clang я сам туда вписал из вредности

А вот, кстати, интересно: какова была тяжесть последствий этой копипасты?

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

eao197 ★★★★★
()
Ответ на: комментарий от anonymous

Когда конторка разорится, тогда всё выложат под GPLv3, как миленькие.

AGPL3 будет правильнее.

Будем ждать с нетерпением!

anonymous
()
Ответ на: комментарий от eao197

А вот, кстати, интересно: какова была тяжесть последствий этой копипасты?

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

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

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от anonymous

Напрасно, такое часто бывает... Идешь-идешь, спотыкаешся и случайно проверяешь проект Clang. :)

BRE ★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Важен сам факт, что такие ошибки есть и мы умеем их находить.

Практика показывает, что ошибки есть всегда. И что вопрос не в их количестве, а в том, насколько они мешают пользователям программы.

Это очень важная мысль, которую я постоянно стараюсь донести до читателей.

Есть еще одна важная мысль, которую вы либо специально не озвучиваете, либо не задумываетесь сами: цена вопроса. Применение статического анализатора не бесплатно: как минимум, придется заплатить за лицензию на анализатор. А ведь есть еще и косвенные расходы, связанные с изменением процесса разработки.

И вот что интересно: насколько это окупается? Грубо говоря, если потратить то же время и те же деньги на увеличение объема тестов, то не получится ли результат еще лучше, чем при использовании анализаторов.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Есть еще одна важная мысль, которую вы либо специально не озвучиваете, либо не задумываетесь сами: цена вопроса. Применение статического анализатора не бесплатно: как минимум, придется заплатить за лицензию на анализатор. А ведь есть еще и косвенные расходы, связанные с изменением процесса разработки. И вот что интересно: насколько это окупается? Грубо говоря, если потратить то же время и те же деньги на увеличение объема тестов, то не получится ли результат еще лучше, чем при использовании анализаторов.

Так и есть. Мы не говорим, что каждый должен приобрести PVS-Studio. В каждом проекте есть своя стоимость ошибок, но на неё мы влиять не можем. И исходя из этой стоимости люди принимают решение, нужен им анализатор или нет. Наша задача только рассказать им, что мы существуем и показать наши возможности.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

В каждом проекте есть своя стоимость ошибок, но на неё мы влиять не можем.

Как раз с вашим навязчивым пиаром есть две проблемы:

- из ваших статей вообще не получается понять, какова эта стоимость, когда и где применение анализатора даст выигрыш, когда нет. Из статей понятно только, что PVS-Studio очень круто натаскан на поиск последствий копипасты;

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

eao197 ★★★★★
()

проанализировал проект командами:
pvs-studio-analyzer trace ...
pvs-studio-analyzer analyze ...
plog-converter ...

увидел, проблему, поправил, опять проанализировал, а проблема все еще висит
make clean и анализ убирает исправленную проблему, а иначе никак ?

x905 ★★★★★
()

Обращение ко всем пользователям Linux-версии PVS-Studio 6.10.

WARNING! Хочу обратить внимание, что сырой лог, полученный сразу после проверки использовать нельзя! Он не предназначен для просмотра и служит только как источник данных для программы plog-converter.

К нам стало приходить большое количество писем, что результатами работы PVS-Studio пользоваться невозможно. Программисты получают огромный файл, с тысячами одинаковых сообщений на один заголовочный *.h файл и прочим мусором. Мучаются, жалуются. Другие, наверное, не жалуются, а молча теряют интерес к PVS-Studio.

Эти файлы и не предназначены для просмотра. Для преобразования их в «человеческий» формат служит утилита plog-converter, описанная в документации. Эта утилита не только преобразует лог, но и удаляет в нём дубликаты для h-файлов, фильтрует сообщения и так далее. Например, есть смысл начать изучение отчета с предупреждений общего назначения первого и второго уровня (ключ -a GA:1,2). Это очень важно, так как иначе программист просто утонет в сообщениях.

В следующей версии, мы планируем изменить изначального формат лога, чтобы было понятно, что это некий бинарный формат и он не предназначен для просмотра. Это должно подсказать программисту, что с этим файлом надо ещё что-то сделать и он, продолжив в чтение документации, будет узнавать про plog-converter.

Andrey_Karpov_2009
() автор топика
Последнее исправление: Andrey_Karpov_2009 (всего исправлений: 1)

А Вы не могли бы пояснить ещё, как вы выбирали логотип. На сайте найти информации на эту тему не получилось. В свою очередь замечу, что логотип блюющего радугой единорога как-то совершенно не способствует к тому, чтобы убедить начальство с вами начать вести диалог.

ASM ★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Это должно подсказать программисту, что с этим файлом надо ещё что-то сделать и он, продолжив в чтение документации, будет узнавать про plog-converter.

Подсказать программисту может:

 - plog-converter - a utility for converting the analysis log into different formats

Но это всё, что может подсказать, так как больше чем README.md у вас в документации нет.

В самой README.md есть раздел Quick run в котором сказано:

The analyzer warnings will be saved in the specified PVS-Studio.log file.

Из чего любой адекватный человек сделает вывод о том, что PVS-Studio.log является конечным вариантом.

P.S> состав вашего дистрибутива:

./install.sh
./plog-converter
./plog-converter-source.tgz
./pvs-studio
./pvs-studio-analyzer
./README.md
./version.txt

Никаких pdf и другой документации я не вижу, а вы?

ASM ★★
()
Ответ на: комментарий от ASM

Какая интересная структура директорий. Явно не хватает скрипта, который бы реализовал всю кухню анализа.

alman ★★★
()
Ответ на: комментарий от eao197

Целью работы любого коммерческого предприятия является (внезапно) прибыль. В каком случае будет больше прибыли: если покупатели, ознакомившись с правдиво описанными фичами, купят продукт, а затем, путём проб и ошибок, поймут, нужен ли он им на самом деле, или если те, кто продвигают продукт, зачем-то заранее отсекут часть покупателей фразой о том, что продукт им может не подойти? Тут, конечно, возможен побочный эффект в виде сделанного кем-нибудь доклада «почему вам не нужен PVS studio», но зачем бежать впереди паровоза? Если кому-то не нравится - пусть он и доказывает и делает рассчёты. В ответ можно и другую схему лицензирования придумать

wingear ★★★★
()
Последнее исправление: wingear (всего исправлений: 1)
Ответ на: комментарий от ASM

- plog-converter - a utility for converting the analysis log into different formats

Рунглийский?

winlook38 ★★
()
Ответ на: комментарий от wingear

Целью работы любого коммерческого предприятия является (внезапно) прибыль.

Прибыль не является целью, а всего лишь необходимым условием для выживания и развития. Но речь не об этом.

если покупатели, ознакомившись с правдиво описанными фичами, купят продукт, а затем, путём проб и ошибок, поймут, нужен ли он им на самом деле

Так я и говорю, тупой маркетинг: у нас есть фичи X, Y, Z, цену нужно спросить отдельно, потом заплатить, попользоваться год, а когда придет время платить снова, подвести итог.

Нет чтобы сказать что-то вроде: в среднем на исправление багов при разработке тратится 15% времени. Если команда больше 20 человек, то этот показатель увеличивается до 18.75%. Если кодовая база больше 1MLOC, то до 20.36%. Если возраст кодовой базы больше 15 лет, то расходы на багфиксинг нужно умножать на e. По проведенным контрольным замерам, использование статического анализатора сокращает эти затраты на 25%.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

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

wingear ★★★★
()
Ответ на: комментарий от wingear

Чтобы ни коем случае у них не купили ничего те, кому это, возможно, не нужно.

А как вообще решать нужно что-то или нет? Вот проверили в СиПроВер компилятор clang, нашли в нем баги. И? Баги есть везде, в clang-е они так же есть. Баги, судя по всему, не критичные. Как зачем тратить деньги на PVS-Studio, если в проекте масштаба и сложности clang-а можно обходиться без PVS-Studio и получать код приемлемого качества?

Другое дело, когда приводят реальные примеры (выше давали ссылку на коммент от пользователя с opennet-овского обусуждения). Там разработчик убил две недели на поиск бага, который сходу был найден анализатором. Две недели работы одного C++ программиста. Ну, скажем, потери только в деньгах составили порядка ~1000USD. Не считая ущерба от тех работ, которые этим программистом выполнены не были.

Неужели в СиПроВер нет набора подобных success story? Неужели они никак не отслеживают, насколько их продукт выгоден их же клиентам? Наверняка эта информация есть. Только вместо того, чтобы писать статьи про такие вещи, они пишут про очередную разовую проверку очередного OpenSource проекта.

eao197 ★★★★★
()
Ответ на: комментарий от wingear

«Целью работы любого коммерческого предприятия является (внезапно) прибыль»

Иногда просто отмывка денег или получение кредитов:-)

anonymous
()
Ответ на: комментарий от ASM
Trans-Proteomic Pipeline

V557 Array overrun is possible. The '3' index is pointing beyond array bound. crypt crypt.cxx 567


int main(int argc, char **argv) {
  ...
  char salt[3];
  ...
  salt[0] = (argc>2)?(argv[1][0]):rndChar[rand() % 64];
  salt[1] = (argc>2)?(argv[1][1]):rndChar[rand() % 64];
  salt[3] = 0;
  ...
}

This is what should have been written here: salt[2] = 0;

Да, оно. А valgrind разве способен на такое?

newprikolist
()
Ответ на: комментарий от newprikolist

Плюс можно включить и отлов в рантайме таких ситуаций, если индекс вычисляется, опять же просто штатными ключами компилятора.

anonymous
()
Ответ на: комментарий от anonymous
cat main.c  
int main(void)
{
        int a[10];
        a[10]=0;
}

cc -v ./main.c 
Используются внутренние спецификации.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/4.9.3/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/lto-wrapper
Целевая архитектура: x86_64-pc-linux-gnu
Параметры конфигурации: /var/tmp/portage/sys-devel/gcc-4.9.3/work/gcc-4.9.3/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.9.3 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.3 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.3/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.3/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4 --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.9.3/python --enable-languages=c,c++,fortran --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.9.3 p1.5, pie-0.6.4' --enable-libstdcxx-time --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-altivec --disable-fixed-point --enable-targets=all --disable-libgcj --enable-libgomp --disable-libmudflap --disable-libssp --disable-libcilkrts --enable-vtable-verify --enable-libvtv --enable-lto --without-cloog --enable-libsanitizer
Модель многопоточности: posix
gcc версия 4.9.3 (Gentoo 4.9.3 p1.5, pie-0.6.4) 
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/cc1 -quiet -v ./main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -version -fstack-protector-strong -o /tmp/ccKtZZRz.s
GNU C (Gentoo 4.9.3 p1.5, pie-0.6.4) версия 4.9.3 (x86_64-pc-linux-gnu)
        скомпилировано GNU C версия 4.9.3, Версия GMP 6.1.0, версия MPFR 3.1.3-p4, версия MPC 1.0.2
эвристики GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
несуществующий каталог "/usr/local/include" проигнорирован
несуществующий каталог "/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/include" проигнорирован
порядок поиска для #include "...":
порядок поиска для #include <...>:
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include-fixed
 /usr/include
Конец списка поиска.
GNU C (Gentoo 4.9.3 p1.5, pie-0.6.4) версия 4.9.3 (x86_64-pc-linux-gnu)
        скомпилировано GNU C версия 4.9.3, Версия GMP 6.1.0, версия MPFR 3.1.3-p4, версия MPC 1.0.2
эвристики GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 973524dd8fa16c05581b97e6e6b67fc3
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/bin/as -v --64 -o /tmp/ccbncgRs.o /tmp/ccKtZZRz.s
GNU ассемблер, версия 2.25.1 (x86_64-pc-linux-gnu); используется BFD версии (Gentoo 2.25.1 p1.1) 2.25.1
COMPILER_PATH=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/:/usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/:/usr/libexec/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/collect2 -plugin /usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.9.3/lto-wrapper -plugin-opt=-fresolution=/tmp/ccWqSjRl.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/crtbegin.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../.. /tmp/ccbncgRs.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/../../../../lib64/crtn.o
newprikolist
()
Ответ на: комментарий от newprikolist

Так у тебя gcc вместо компилятора.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.