The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск cppcheck 2.12, статического анализатора кода для языков C++ и С

15.09.2023 16:14

Вышла новая версия статического анализатора кода cppcheck 2.12, позволяющего выявлять различные классы ошибок в коде на языках Си и Си++, в том числе при использовании нестандартного синтаксиса, типичного для встраиваемых систем. Предоставляется коллекция плагинов, через которые обеспечена интеграция cppcheck с различными системами разработки, непрерывной интеграции и тестирования, а также предоставлены такие возможности как проверка соответствия кода стилю оформления кода. Для разбора кода может применяться как собственный парсер, так и внешний парсер от Clang. В состав также входит скрипт donate-cpu.py для предоставления локальных ресурсов для выполнения работы по совместной проверке кода пакетов Debian. Исходные тексты проекта распространяются под лицензией GPLv3.

Развитие cppcheck сосредоточено на выявлении проблем, связанных с неопределённым поведением и применением конструкций, опасных с точки зрения безопасности. Целью также является минимизация ложных срабатываний. Среди выявляемых проблем: указатели на несуществующие объекты, деления на ноль, целочисленные переполнения, некорректные операции битового сдвига, некорректные преобразования, проблемы при работе с памятью, некорректное использование STL, разыменование нулевых указателей, применение проверок после фактического обращения к буферу, выход за границы буферов, использование неинициализированных переменных.

Основные изменения:

  • Добавлена проверка "uselessOverride" обнаруживающая бесполезные переопределения функций, которые дублируют код или вызывают реализацию базового класса;
  • Добавлена проверка "knownPointerToBool" - преобразование указателя в переменную булевского типа, результатом которой всегда является истинное или ложное значение.
  • Улучшенные проверки:
    • В проверки "truncLongCastAssignment" и "truncLongCastReturn" добавлен контроль дополнительных типов, включая float и double;
    • Проверка "duplInheritedMember" теперь дополнительно сообщает о дубликатных функциях-членах;
    • Проверки "constParameter*"/"constVariable*" обнаруживают больше случаев, когда указатели/ссылки могут иметь модификатор const, например при вызове библиотечных функций.
  • Графический интерфейс:
    • В статистике формируются сведения о том, какие проверки были включены в последнем анализе;
    • Реализовано выделение критических ошибок, из-за которых могли быть пропущены проверки.
  • Изменения в интерфейсе:
    • Добавлена выдача количества проверок, сработавших с запуска;
    • Добавлен параметр командной строки '--checkers-report' который управляет формированием в файле протокола сведений о том, какие проверки сработали, а какие были отключены.
  • Объявлено устаревшим:
    • Система сборки qmake объявлена устаревшей и будет удалена в будущей версии;
    • Параметр командной строки '--template ' объявлен устаревшим и будет удалён в версии 2.13, используйте '--template=';
    • Параметр командной строки '--template-location ' объявлен устаревшим и будет удалён в версии 2.13, используйте '--template-location=';
  • Другое:
    • Параметр сборки "USE_QT6=On" больше автоматически не переключается на Qt5, если Qt6 не найдена;
    • Если аварийное завершение дополнения сопровождалось кодом завершения, то теперь будет приводить к "internalError", а не будет проигнорировано;
    • Конфигурация "Win32" была удалена из проектов и решений Visual Studio. Cборку исполняемых файлов для 32-х битной архитектуры по-прежнему можно выполнить при помощи CMake, но такой способ не тестируется и не сопровождается.


  1. Главная ссылка к новости (https://github.com/danmar/cppc...)
  2. OpenNews: Выпуск cppcheck 2.11, статического анализатора кода для языков C++ и С
  3. OpenNews: Выпуск PHPStan 1.0, статического анализатора для кода на языке PHP
  4. OpenNews: Facebook открыл код статического анализатора Infer
  5. OpenNews: Релиз свободного статического анализатора кода frama-clang 0.0.5
  6. OpenNews: Открыт код статического анализатора Code Climate
Автор новости: Совершенно другой аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59764-cppcheck
Ключевые слова: cppcheck
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (160) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 21:59, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Кто-то использовал? Мнение?
     
     
  • 2.2, Аноним (2), 22:16, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Smatch на 2 головы полезнее.
     
     
  • 3.24, Аноним (24), 00:53, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ты вот это васяноподелие пытаешься рекламировать?

    https://github.com/error27/smatch

    туда твой однострочный PR приняли? эйфория?

     
     
  • 4.29, Аноним (2), 01:06, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Сам ты васяноподелие. Буквально. А сообщения там куда полезней были, цппчек ничего не видел.
     
  • 2.9, warlock66613 (ok), 22:49, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • +11 +/
    Мнение: любой статический анализатор лучше отсутствия статического анализатора.
     
     
  • 3.15, Аноним (15), 23:29, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Исправлять надо причину появление ошибок, а не вылавливать их как блох уже после того как они появились.
     
     
  • 4.17, Аноним (17), 23:51, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Вот так и напиши в своём заявлении по собственному.
     
     
  • 5.18, Аноним (15), 23:55, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • –12 +/
    Я не пользуюсь дырявыми языками родом из 50-х.
     
     
  • 6.22, _kp (ok), 00:05, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Соответственно с микроконтроллерами не работаете, производительные модули не используете, про драйвера молчу.
    Задачи то разные бывают.
    Десктопное приложение и я на С++ добровольно писать не стану.
     
  • 6.28, Аноним (28), 01:01, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Electron гуру? JS сенсей? CSS будда?
     
     
  • 7.46, Аноним (-), 09:17, 16/09/2023 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
  • 7.47, Первая буква (?), 09:18, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Микрософт Ворд печатник.
     
  • 6.122, Аноним (-), 10:08, 17/09/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 6.134, Аноним (134), 11:58, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >Я не пользуюсь дырявыми языками родом из 50-х.

    Напиши это в резюме и выдели жирным.

     
     
  • 7.186, Аноним (15), 20:54, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всегда так делаю.
     
  • 4.19, Аноним (19), 23:56, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Исправлять надо причину появление ошибок, а не вылавливать их как блох уже
    > после того как они появились.

    Ну да, нужно просто начать писать код без ошибок. Делов-то.

     
     
  • 5.73, Аноним (73), 17:00, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Или использовать известный безопасный язык со строгим конпелятором.
     
     
  • 6.132, Аноним (134), 11:51, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    То есть Crab.
     
  • 4.21, _kp (ok), 00:02, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Есть ещё мелкие опечатки, описки, которые компилятор в вполне скомпилирует, а анализатор может на подобное выдать сообщение.
     
  • 4.144, Аноним (144), 13:35, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Исправлять надо причину появление ошибок

    Так можно и в протворечие с резолюции 260 (III) запросто войти.

     
  • 2.20, _kp (ok), 00:00, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если самосборный использовать, подавив лишниее сообщения, то вполне полезен, и не раздражает, а в стоковом виде среди спама заметить что то подозрительное мало реально.
    А ключами не все управляемо, сразу весь тип проверок или включается или выключается.
     
     
  • 3.25, Аноним (24), 00:56, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    а грепнуть лишнее не вариант?
     
     
  • 4.30, _kp (ok), 01:20, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > а грепнуть лишнее не вариант?

    Можно, если любите длинные выражения писать, и нужно если ещё и любите их потом править.
    И в награду будет ощутимое снижение компиляции.

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


     
     
  • 5.33, Аноним (-), 02:22, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну, Си используется для микроконтроллеров, и тамошние трюки он в шоке.

    Фирмару надо нормально писать - тогда оки все. Я проверял - у меня практически без варнингов, кроме разве что bug-hunting mode получается. А за трюки в критичном софте - воздается. Жесткими фэйлами. У него bug-hunting - это exploratory mode когда можно получить сообщения которые не проблема, но могут и быть проблемой.

    И если фильтровать вывод анализера - вы как раз баги и пролюбите. Код надо фиксить, а не...

     
     
  • 6.36, _kp (ok), 03:09, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Фирмару надо нормально писать
    > у меня практически без варнингов

    Я не Ардуины, а о более реальных крупных проектах для микроконтроллеров.
    От компилятора то варнингов и нет, они или хинты есть от cppcheck, и часто грубо не по делу, то есть спам.

    > И если фильтровать вывод анализера - вы как раз баги и пролюбите.

    Не думае те же Вы, что cppcheck святее Папы Римского? Нет конечно. Но дополнительную проверку делает.
    И особенно полезен, когда часть кода писал не сам.

    > Код надо фиксить, а не...

    Да ну? Атрибуты убрать? В embedded это даёт заметный сразу эффект ;)
    Или аппаратные фичи не использовать, потому что анализатор о них понятия не имеет?

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

     
     
  • 7.81, Аноним (-), 17:44, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    У ардуины код крупный как раз - 100500 либ и черт его знает что там про них чеке... большой текст свёрнут, показать
     
  • 6.66, penetrator (?), 14:11, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    когда у тебя на 1 ошибку 10000 бесполезных советов, то такой статический анализатор это геморой и явно НЕ дейли инструмент
     
     
  • 7.82, Аноним (-), 17:48, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > когда у тебя на 1 ошибку 10000 бесполезных советов, то такой статический
    > анализатор это геморой и явно НЕ дейли инструмент

    Или как вариант - д@рьмовый кодер, возомнивший себя самой умной клавой на глобусе. С сишкой это почему-то очень часто случается. И потом у таких в коде куча CVE и просто багов. А когда суперкод начинают тыкать палочкой - вооооон там майнтайнер XFS с такого счастья сбежал в панике, за такими кодерами разгребать устал как раз.

     
     
  • 8.89, Анонин (?), 18:40, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    О, так это их стандартное поведение Они же типа ылитка А потом начинается или... текст свёрнут, показать
     
     
  • 9.109, Аноним (-), 21:27, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну вот я немного подустал за ними править отрицательные индексы, левую математик... текст свёрнут, показать
     
     
  • 10.133, Аноним (134), 11:56, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Устал - гоу на пенсию, нытик-неосилятор Пылинку в чужом коде все горазды замети... текст свёрнут, показать
     
     
  • 11.152, Аноним (-), 16:41, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну если buffer overrun при определенных аргументах, или факап в математике выдаю... текст свёрнут, показать
     
  • 6.155, т1110втфатф1110 (?), 17:08, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Сразу видно человека который фирмварь никогда не писал, иначе знал бы что hardware сишники, кроме костылей и велосипедов никогда ничего не пишут, потому что те кто разрабатывают железо, делают его через задницу, и вот эту задницу нужно подтирать софтом.
     
     
  • 7.158, Аноним (158), 18:11, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    💯 пудов.

    особенно такое проявляется конда и "платку сам разводил и фирмварю сам писал"

     
  • 5.59, Аноним (24), 13:12, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    зачем мне писать и править длинные выражения, что такое выражени, что такое снижение компиляции?

    короче, я этот набор слов с рандомными запятыми не распарсил

     
     
  • 6.117, C00l_ni66a (ok), 04:16, 17/09/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.32, Аноним (-), 02:19, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Кто-то использовал? Мнение?

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

     
  • 2.119, Мда (?), 08:53, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Из бесплатных - лучший. Но полное г. по сравнению с платными.
     

     ....большая нить свёрнута, показать (37)

  • 1.3, Хосе (?), 22:23, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    быстро развивается
     
  • 1.10, Аноним (15), 22:57, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –8 +/
    Сначала слепили дврявый язык, а теперь думают как избавить код от ошибок 🤣
     
     
  • 2.56, Аноним (56), 10:40, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Другие написали точно такой же дырявый язык и пытаются всем внушить что он не дырявый. 🤣
     
     
  • 3.74, Аноним (73), 17:02, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Пруфы дырок будут или только газификации луж
     
     
  • 4.135, Аноним (134), 12:03, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >Сначала слепили дврявый язык, а теперь думают как избавить код от ошибок

    Ждем пруфы дырок.

     

  • 1.11, Аноним (11), 23:03, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Именно поэтому Раст не нужен. Пока проблемы решаются через анализаторы кода, отдельное решение, не совместимое с прежней кодовой базой, не нужно.
     
     
  • 2.13, Аноним (13), 23:23, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Не решаются. Количество ИЗВЕСТНЫХ уязвимостей не даст соврать. А сколько ещё НЕИЗВЕСТНЫХ....
     
     
  • 3.136, Аноним (134), 12:07, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    То же самое применимо к новому языку. А сколько у него еще НЕНАПИСАНЫХ ошибок...
     
  • 2.42, _kp (ok), 04:45, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Именно поэтому Раст не нужен. Пока проблемы решаются через анализаторы кода,

    Rust - не даёт прострелить ногу, пока не используется unsafe. Ну, по крайней мере, концептуально должен не дать.

    > решение, не совместимое с прежней кодовой базой, не нужно.

    А чисто исходники на Си, и тем более C++, но написанные под разные их стандарты или реалиции компиляторов, архитектуры, типа переносимы без их правки. А уж проявление граблей при переносе и вовсе непредсказуемо, в том числе анализаторами.

    Предположим в очередной стандарт Си добавят фичи из Rust, так на несовместимость исходников и слова не скажут, ибо не хочешь - не используй.
    А тогда с Rust что не так? Там претензии не столько к менее читаемому синтаксису, сколько к системе сборки и зависимостям.

     
     
  • 3.43, Аноним (43), 08:01, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    std::unique_ptr.
    С разморозкой, появился в 2011 году
     
     
  • 4.44, Аноним (44), 09:04, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    угу,
    а куча проектов все еще на более древних версиях
    и переходить они не собираются, ибо костылей и ub там столько, что проще забить
     
     
  • 5.53, Аноним (56), 10:37, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Раст переписать в принципе невозможно. Давай ещё аргументов.
     
  • 4.60, Аноним (24), 13:13, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    это конкретно std::unique_ptr появился тогда, но никто не мешал до него написать свой
     
     
  • 5.72, Анонми (?), 16:40, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Мелало отсутствие мув-семантики.
     
  • 4.126, Советский инженер (?), 10:22, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    И как тебе этот юникпоинтер не позволит изменить значение из разных потоков?
     
  • 3.48, Аноним (-), 09:22, 16/09/2023 Скрыто ботом-модератором     [к модератору]
  • +2 +/
     
  • 3.55, Аноним (56), 10:39, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ты всегда используешь ансей в расте, зачем тогда Раст. Ни один растовик пока что на этот вопрос не смог внятно ответить.
     
     
  • 4.64, warlock66613 (ok), 13:27, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Rust всегда Rust, что safe, что unsafe: правила одни и те же и там и там. В unsafe блоках ты берёшь часть проверок на себя, только и всего. В safe части ты можешь расслабиться, в unsafe приходится напрячься, но unsafe блоки пишутся максимально просто — так, чтобы без особых трудностей следовать правилам, а запутанные вещи делаются в safe части.
     
  • 4.67, Аноним (19), 14:18, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Ты всегда используешь ансей в расте, зачем тогда Раст.

    Ты всегда пишешь чушь?

    > Ни один растовик пока что на этот вопрос не смог внятно ответить.

    Внятно - это в рамках персонально твоей, альтернативной логики и реальности?

     
  • 4.70, Анонимусс (?), 16:01, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ни один растовик пока что на этот вопрос не смог внятно ответить.

    Может ты просто не в состоянии осилить ответ?))

     
     
  • 5.79, Аноним (-), 17:31, 16/09/2023 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
  • 2.164, Мда (?), 20:52, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Раст, по факту, это один большой стат. анализатор.
     

  • 1.12, Аноним (13), 23:22, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Чем бы ни страдать, абы на язык с нормальным компилятором не переходить, в котором бОльшая часть ошибок ловится на этапе компиляции без всяких дополнительных телодвижений.
     
     
  • 2.14, Аноним (14), 23:23, 15/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    необучаемость, сэр.
     
  • 2.26, Аноним (24), 00:58, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    столько не живут, сколько ты будешь свой говнокод переделывать под хотелки компилятора
     
     
  • 3.31, Аноним (31), 01:51, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А под хотелки статического анализатора не нужно переделывать, да?
     
     
  • 4.52, Аноним (56), 10:36, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Как только он начинает выпендриваться на него кладется болт и хотела идёт в исключения.
     
     
  • 5.75, Аноним (73), 17:04, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Звучит надёжно и очень безопасно
     
     
  • 6.167, Аноним (167), 23:26, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Уже ходишь в бронетрусах?
     
  • 5.111, Аноним (-), 21:30, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Как только он начинает выпендриваться на него кладется болт и хотела идёт в исключения.

    А потом вы такой садитесь в тоету с непатченым ECU и наслаждаетесь острыми ощущениями... правда, сможете ли вы ими поделиться с окружающими - вот это как повезет уже. Как показали натурные эксперименты, везло не всем.

     
  • 4.61, Аноним (24), 13:15, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    да, не надо, потому что он указывает на косяки, а не на шизофазию головного мозга "разработчиков" раста и их видение реальности. эталонное шашечки и ехать
     
  • 2.51, Anonim (??), 10:36, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну Herb Sutter уже пишет новый cpp2.. Очнулись таки
    https://github.com/hsutter/cppfront
     
  • 2.54, Аноним (54), 10:37, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Страуструп тут недавно выступал и совершенно точно подметил, что те, кто думает, что корректность программы исчерпывается правильной работой с памятью, не понимают примерно ничего в этой жизни https://www.youtube.com/watch?v=eo-4ZSLn3jc
     
     
  • 3.65, warlock66613 (ok), 13:32, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Страуструп не понимает что UB — это не "некорректность". Суть не в том чтобы писать без ошибок, смысл в том, чтобы писать программы хотя бы синтаксически корректные, то есть без UB.
     
     
  • 4.68, Аноним (54), 14:32, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Пионеры не в состоянии понять, что UB - это следствие разнородности аппаратных платформ, с которыми C++ должен уметь эффективно работать непосредственно. И когда их любимый пионерский язычок натыкается на целочисленное переполнение в релизной сборке, он ведет себя точно так же неопределенно, как и C++.
     
     
  • 5.69, Анонин (?), 15:58, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > пионерский язычок натыкается на целочисленное переполнение в релизной сборке, он ведет себя точно так же неопределенно

    А вот и нет. Что для signed int, что для unsigned int выполняется two’s complement wrapping.
    Т.е. нет никакого UB, потому что результат выполнения будет однозначный, в отличие от плюсов и сишки.
    https://github.com/rust-lang/rfcs/pull/560

    Читайте маны, а не плодите мифы!

     
     
  • 6.71, Аноним (54), 16:03, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы либо крестик снимите, либо трусы наденьте: если вы пишете, что у вас нет runtime и overhead, то не пишите, что у вас нет UB, и наоборот - если у вас нет UB, тогда у вас есть runtime и/или overhead, которые обеспечивают поведение согласно вашим хотелкам на платформах, у которых поведение другое.
     
     
  • 7.83, Анонми (?), 17:51, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > если вы пишете, что у вас нет runtime и overhead, то не пишите, что у вас нет UB

    Oh, my sweet summer child... Наличие UB не дает магического прироста скорости. Оно лишь дает право выстрелить себе в ногу, написав некорректный по определению код, а компилятору - право закрыть на это глаза.

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

     
     
  • 8.84, Аноним (24), 17:57, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    неофиты неисправимы если ты знаешь, как работает комп, на котором ты будешь з... текст свёрнут, показать
     
     
  • 9.86, Анонимусс (?), 18:17, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Боже вот из-за таких как ты, нынешний софт такой багованый Открываем ISO I... текст свёрнут, показать
     
     
  • 10.87, Аноним (54), 18:26, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну так по этому определению твой любимый пионерский язычок, в котором якобы нет ... текст свёрнут, показать
     
     
  • 11.88, Анонимусс (?), 18:38, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Нет, речь не про раст, и даже не про с А про подход, что ты просто берёшь и ... текст свёрнут, показать
     
     
  • 12.91, Аноним (54), 19:02, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Поведение integer overflow описано и зафиксировано и в C ТОЖЕ Только описано ... текст свёрнут, показать
     
     
  • 13.94, Анонимусс (?), 19:13, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А вот теперь пруфы для signed integer overflow хотя бы для пары платформ ссылки... текст свёрнут, показать
     
     
  • 14.99, Аноним (54), 20:06, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Пожалуйста https gcc gnu org onlinedocs gcc Code-Gen-Options html А теперь ра... текст свёрнут, показать
     
  • 13.95, Анонми (?), 19:34, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Нет, дружок, не зафиксированно В стандарте C черным по белму написано, что si... текст свёрнут, показать
     
     
  • 14.100, Аноним (54), 20:10, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ещё раз UB в этом контексте означает то же поведение, что и в пионерском язычке... текст свёрнут, показать
     
     
  • 15.103, Анонми (?), 20:32, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    UB в этом - и в любом другом - контексте не может означать какого-то поведения ... текст свёрнут, показать
     
     
  • 16.104, Аноним (54), 20:40, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я на C деньги зарабатываю, а ты пионер, который пересказывает проповеди еванге... текст свёрнут, показать
     
     
  • 17.110, Анонимусс (?), 21:28, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это не так Ты сейчас говоришь про 3 29 unspecified behavior behavior, for a we... большой текст свёрнут, показать
     
     
  • 18.113, Аноним (54), 22:23, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я говорю так, как оно есть, но я пытаюсь что-то донести до пионера-фанатика, кот... текст свёрнут, показать
     
     
  • 19.115, Аноним (31), 23:17, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Забавно было бы услышать, почему тогда 70 всех уязвимостей - это именно работа ... текст свёрнут, показать
     
     
  • 20.116, Аноним (54), 23:51, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Дорогой пионер, стандартов C уже 6 штук и на подходе 7-й И различаются некото... текст свёрнут, показать
     
  • 21.127, Советский инженер (?), 10:32, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    И все так счастливы поддерживать этот прекрасный язычок что, как ты и сам замети... текст свёрнут, показать
     
  • 19.124, Анонимусс (?), 10:20, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Дорогой непионер, мы все уже давно поняли твою позицию и что ты из себя представ... текст свёрнут, показать
     
     
  • 20.129, Аноним (54), 11:11, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не забудь принять стандарт ISO пионерского язычка и сменить дыряшку на реактос... текст свёрнут, показать
     
  • 21.139, Аноним (158), 12:30, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    скомпиляй ядро без расширений GNU для С, и тогда что-то рассказывай, любитель ст... текст свёрнут, показать
     
  • 22.147, Аноним (147), 14:30, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы думаете это случайно так По недомыслию разработчиков стандартов Вы то умнее... текст свёрнут, показать
     
  • 23.157, Аноним (158), 18:02, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    я не знаю по какой причине стандарт такой как есть, но вот хвастатся таким станд... текст свёрнут, показать
     
  • 24.160, Аноним (147), 19:44, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    То есть, не читал, но осуждаю Он есть В отличии от И он рассчитан на развит... текст свёрнут, показать
     
  • 25.171, Советский инженер (?), 04:47, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не мычи, ядро по стандарту собрал или нет Если нет, то пошол вон ... текст свёрнут, показать
     
  • 23.184, Аноним (184), 20:04, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это вендорлок ... текст свёрнут, показать
     
  • 20.130, Аноним (147), 11:13, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Забавно слышать от фанатов rust а У которых нет стандарта И есть 1 2 реализаци... текст свёрнут, показать
     
  • 21.138, Аноним (158), 12:24, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    ха, чем такие стандарты в которых UB в перемешку с implementation-defined, котоы... текст свёрнут, показать
     
  • 22.145, Аноним (147), 13:37, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Во Во Это ниша пионерских язычков Вот так и живите дальше ... текст свёрнут, показать
     
  • 23.148, Аноним (31), 14:41, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А мы будем и дальше просто брать, и делать UB , да Ох и цирк ... текст свёрнут, показать
     
  • 24.161, Аноним (147), 19:46, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это чувство самосохранения Не заниматься однодневками ... текст свёрнут, показать
     
  • 25.174, Советский инженер (?), 08:07, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    С таким подходом тебе надо безопасненько на Яве писать , или вообще на коболе Т... текст свёрнут, показать
     
  • 26.181, Серб (ok), 17:16, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Скопипащу с форума одного сайта Это то, что очевидно, но как-то многие делают в... текст свёрнут, показать
     
  • 27.182, Аноним (158), 18:34, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    блииин, а я всегда думал надо чтоб собранное работало а оно вот как, собра... текст свёрнут, показать
     
  • 28.183, Серб (ok), 18:40, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Зачем попросту ерничать Понятно же, что и работать должно ... текст свёрнут, показать
     
  • 11.108, Аноним (19), 21:17, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не совсем Это ты можешь либо эт-самое в лужу, либо просто в сторону растоманов... текст свёрнут, показать
     
  • 9.96, Анонми (?), 19:38, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ахаха Чел, ты это серьезно Вот и все, что нужно знать о противниках Раста За... текст свёрнут, показать
     
  • 5.76, Анонми (?), 17:06, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Пионеры не в состоянии понять, что UB - это следствие разнородности аппаратных платформ, с которыми C++ должен уметь эффективно работать непосредственно

    Извини, но нет: концепция UB не добавляет C/C++ возможность поддержки каких-то дополнительных платформ, и уж точно она не про эффективность. Согласно стандарту, наличие UB в программе делает ее некорректной на абсолютно любой платформе.

     
     
  • 6.80, Аноним (-), 17:35, 16/09/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 5.98, warlock66613 (ok), 20:02, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы явно путаете undefined behavior и implementation-defined behavior. Это _очень_ разные вещи.

     
     
  • 6.101, Аноним (54), 20:19, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, это вы не понимаете, что аппаратная платформа отличается от компилятора, для которого и применяется термин "implementation-defined", и что для аппаратной платформы поведение может быть четко определено даже если оно не определено в стандарте языка.
     
     
  • 7.105, Анонми (?), 20:44, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну как бы да, это и есть implementation-defined behavior. Но вы его путаете с undefined behavior, которое при любом раскладе undefined.
     
     
  • 8.128, Аноним (128), 11:00, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Из одного может получиться другое Скажем формат signed - implementation defined... текст свёрнут, показать
     
  • 8.131, Аноним (54), 11:22, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я ничего не путаю Это ты не понимаешь, что есть стандарт C для десятков компи... текст свёрнут, показать
     
     
  • 9.159, Аноним (158), 18:37, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ага, ага стандарт есть, но мягкий 129315 да и сам язычек такой, что при перв... текст свёрнут, показать
     
     
  • 10.163, Аноним (147), 20:36, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ты имеешь ввиду мозилу, которая получив опыт, свалила с rust а ... текст свёрнут, показать
     
     
  • 11.175, Аноним (158), 10:27, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    мозила свалила с раста только в альтернативной реальности местных икспертов ... текст свёрнут, показать
     
  • 11.176, Аноним (31), 10:37, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ты нагло лжешь https wiki mozilla org Oxidation Rust_Components https 4e6 g... текст свёрнут, показать
     
     
  • 12.178, Серб (ok), 14:09, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Так, интереса ради, что на нем сейчас пишут в firefox Что подсмотреть за интере... текст свёрнут, показать
     
  • 7.123, Советский инженер (?), 10:12, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Бла бла бла UB, бла бла бла implementation-defined ...

    Так и что там с корректностью?
    Один спрыгивает с дырявости на корректность, другой с корректности на неопределенное поведение. Что значит по сути предьяв и сказать нечего. Остаётся только извивается.

     
     
  • 8.141, Аноним (31), 12:44, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    С корректностью чего именно По сути каких именно предьяв ... текст свёрнут, показать
     
     
  • 9.142, Аноним (158), 12:58, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    вот уж действительно, о какой корректности в контексте полюсов можно говорить о... текст свёрнут, показать
     
  • 8.143, Аноним (31), 13:03, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Чел, при наличии UB в коде и сам код, и получающиеся из него бинари некорректны ... текст свёрнут, показать
     
  • 5.112, Аноним (-), 21:37, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    На практике это скорее ведет к хреновой куче багов в коде на ровном месте А ком... большой текст свёрнут, показать
     
  • 3.77, Анонми (?), 17:18, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Страуструп тут недавно выступал и совершенно точно подметил, что те, кто думает, что корректность программы исчерпывается правильной работой с памятью, не понимают примерно ничего в этой жизни

    Да, да... А то, что более 70% всех уязвимостей в софте вызваны именно неправильной работой с памятью в C и C++ он тактично промолчал?

     
     
  • 4.90, Аноним (54), 18:49, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, ровно об этом и говорил: do not use low-level unsafe features - hide them in containers or libraries.
     
     
  • 5.97, Анонми (?), 19:52, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > hide them

    Ага, уязвимости же от этого магическим образом исчезают.  Это типа как мусор заметать под ковер. Как жаль, что всякие дурачки, изабретающие и внедряющие расты, не знают об этом простом и эффективном способе решения 70% проблем.

     
  • 4.92, неАнон (?), 19:03, 16/09/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.192, BeLord (ok), 11:44, 22/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну и где у нас нормальные компиляторы?-))
     

     ....большая нить свёрнута, показать (72)

  • 1.16, Аноним (16), 23:30, 15/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Лучше valgrind'а?
     
     
  • 2.27, Аноним (24), 00:59, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    одновременно юзаю valgrind, clang static analyzer и cppcheck
     
  • 2.34, Аноним (-), 02:25, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Лучше valgrind'а?

    Он как бы не замена оному. Есть статический анализ, а есть анализ в рантайме. Valgrind о втором. Он рантайм-анализатор проблем и его больше смысла сравнивать с asan/ubsan чтоли. Которые так то тоже не замена статическому анализу а рантайм-дополнение к нему.

     

  • 1.35, Аноним (15), 02:36, 16/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чего только не придумают лишь бы не писать без ошибок...
     
     
  • 2.37, burjui (ok), 03:25, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Действительно, ведь всего-то нужно начать с

    int main(void)
    {
        return 0;
    }

    а дальше — согласно стандарту. Изи.

     
     
  • 3.45, Аноним (44), 09:05, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    я бы еще добавил каст к void*, ну так, чисто чтобы держать планку
    и чтобы следующие пограммисты не расслаблялись)
     
  • 3.62, Аноним (24), 13:17, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    согласно теории ошибок либо у тебя в программе нет ошибок, либо она никому не нужна
     
     
  • 4.63, Аноним (24), 13:17, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    *есть ошибки
     

  • 1.85, Аноним (85), 18:06, 16/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кто-то хоть раз с этим анализатором РЕАЛЬНЫЙ баг находил? вот который на самом деле происходит, а не так, "теоретически, если потом кто-то поменяет код".

    По мне эти улититы анализа - пустая трата времени на то чтобы читать их высеры

     
     
  • 2.120, Мда (?), 08:56, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Да, например случайная копипаста недоправленная, т.е. что-то типа (точно не помню):
    memcpy(x, y, sizeof(y));
    memcpy(z, k, sizeof(y));
     
     
  • 3.153, Аноним (-), 16:53, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Да, например случайная копипаста недоправленная, т.е. что-то типа (точно не помню):
    > memcpy(x, y, sizeof(y));
    > memcpy(z, k, sizeof(y));

    Можно рубануть в стиле антибаг. Наример:
    #define MEMCOPY(x, y)  memcpy((x), (y), sizeof(y)).

    ...а теперь попробуйте так облажаться в MEMCOPY() вообще? Да, caveats у этого решения увы, тоже есть :). А еще в идеале нехило бы проверить что sizeof(x) == sizeof(y). Иначе можно жизнерадостно вынести все что за x из памяти и глазом не моргнуть если x меньше y по размеру.

    Эти олдовые функции мало того что с дурным прототипом так еще злее опасной бритвы. В два счета снимут скальп случайно при бритье, если заказать что-то не то. И вот идете вы такой весь перемотаный бинтами на горле, черепухе, "ничего себе к цирюльнику сходил"

     

  • 1.106, Govein (?), 20:46, 16/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > статического анализатора кода для языков C++ и С

    А почему не С и С++? Так же намного привычнее.

     
     
  • 2.114, хрю (?), 22:48, 16/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ну, наверно, потому что  это cpp check, а не c check +).
     

  • 1.125, iPony129412 (?), 10:21, 17/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    хорошая штука, до VPS 🦄 конечно не дотягивает, но всё же.
     
  • 1.149, Каптер (?), 15:12, 17/09/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А существует ли книга (или серия статей) о best practices в языке C? Чтоб сразу писать более надежно, а не набивать шишки.
     
     
  • 2.154, Аноним (-), 17:02, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    1 Embedded C coding standard - by M Barr - можно укачать нашару насколько я пом... большой текст свёрнут, показать
     
     
  • 3.162, Аноним (147), 19:53, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > 4. Забить в поискарь "antibug coding C" и получить бонусов из разных мест. Узнаете почему лучше сравнения делать вида if (10 == a) а не (if a == 10). Хинт: при опечатке if (a = 10) vs if (10 = a) это две большие разницы. Поэтому второй вариант - антибажный.

    И есть несколько книг, описывающие, что так делать нельзя, так как хуже воспринимается человеком. А код должен понимать человек. И написан он должен быть так, что бы его было легче воспринимать.
    А такие ошибки уже давно не то что cppcheck'ами проверятся, а самими компиляторами.

     
     
  • 4.169, Аноним (-), 01:56, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Компилер при случае жестко рубанувший присвоение переменной a числу 10 как невоз... большой текст свёрнут, показать
     
  • 3.172, Каптер (?), 07:28, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >при опечатке if (a = 10) vs if (10 = a)

    Никогда не понимал, почему в сишке разрешено присваивание в условии. Ведь это ещё один источник ошибок.

     
     
  • 4.177, Аноним Максим (?), 12:18, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    if( a ) .. - не смущает же
    и if( retcode=fn() ) .. тоже не смущает, и более того, всё очевидно

    А вот if( a = b )   - уже нарушает читаемость, и чужого не работающего кода особенно, ибо возникает подозрение на опечатку.

    Ну а if( a = const ) - это с вероятностью 96% - ляп.
    В оставшихся случаях это последствия автогенерации кода, или замены #ifdef на константные if.

     
     
  • 5.179, Каптер (?), 16:27, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Честно говоря - смущает.
     
  • 5.180, Аноним (-), 17:01, 18/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > и if( retcode=fn() ) .. тоже не смущает, и более того, всё очевидно

    Вопрос: а зачем тут "retcode" вообще? if ( fn() ) было чем-то не круто? Или если retcode надо потом то зачем это в if () вообще было? Чтобы логику менее очевидной сделать?

     
     
  • 6.188, Совершенно другой аноним (?), 08:28, 19/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    например, для того, чтобы
    if ((retcode = fn()) == 0)
    {
    }
    else
    if (retcode > 0)
    {
    }
    else
    {
    }
     
     
  • 7.190, Аноним (-), 02:52, 21/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Чувак, открой для себя тег [!code] ...  [!/code] (без восклицательных знаков, они тут для срыва парсинга этого тега). Хотя возможно ты получившимся контринтуитивным форматированием где мозг сломаешь какая ветка в каком случае выполняется специально вкатил и хотел подхайлайтить лишний раз почему так программить не стоит? :)
     
  • 4.189, voiceofreason (?), 01:05, 21/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Сэкономить одну строчку на кулхацкерских понтах
     
     
  • 5.191, Аноним (-), 02:54, 21/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Сэкономить одну строчку на кулхацкерских понтах

    Как-то так в программах и появляются баги на ровном месте, а коллега неверно трактовавщий фрагмент кода - наломает и еще дров.

     
  • 2.168, Аноним (168), 23:36, 17/09/2023 [^] [^^] [^^^] [ответить]  
  • +/
    https://gist.github.com/Earnestly/7c903f481ff9d29a3dd1
    Вот здесь список проявлений неопределённого поведения.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру