The OpenNET Project / Index page

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

Разбор типичных ошибок при разработке на С/С++

14.04.2016 16:14

Андрей Карпов, специализирующийся на системах статического анализа кода, опубликовал практические рекомендации по программированию на языках С/С++, основанные на ошибках, выявленных при проверке различных открытых проектов. В большинстве своем советы универсальны и будут интересны программистам, использующим и другие языки. Каждая рекомендация сопровождается практическим примером с разъяснением.

  1. Главная ссылка к новости (http://www.viva64.com/ru/b/039...)
Автор новости: el_programmer
Тип: яз. русский / Практикум
Ключевые слова: gcc, lang, bug
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (71) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, евнрвпвапр (?), 09:54, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо, побольше бы здесь подобных статей
     
     
  • 2.65, Аноним (-), 03:54, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Статья (на opennet) информативна наредкость. И объёмна в одинаковой с информативностью степени.
     

  • 1.2, Аноним (-), 09:57, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Не стал читать, текста много #sidebar мешает, выложите в markdown на 100%
     
     
  • 2.7, Анаон (?), 10:13, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Включи в фарфоксе "Режим чтения" и ничего не помешает.
     
     
  • 3.15, Аноним (-), 11:04, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    От этого он типографику не дорисует.
     

  • 1.4, Модификатор (?), 10:06, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –12 +/
    Что это
    >> Целью статьи является предостережение программиста от ошибок,
    >> с которыми он может столкнуться при написании кода.

    ??
    На каком это языке написано?
    Кто на ком стоял?

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

     
     
  • 2.6, Аноним (-), 10:12, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    А по поводу статьи что скажешь?
     
     
  • 3.8, А (??), 10:20, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +9 +/
    Реклама PVS-Studio :)
     
     
  • 4.23, OramahMaalhur (ok), 11:37, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +15 +/
    Если бы вся реклама была такой полезной и информативной, я бы удалил uBlock...
     
  • 3.17, Модификатор (?), 11:11, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > А по поводу статьи что скажешь?

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

    Но вот с формой подачи этого материала и примерами уже неоднозначно.
    Статья интересная, но местами противоречивая.
    Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows,  Visual Studio, WinAPI и т.п.
    Полезное там, несомненно, есть, но далеко не для всей аудитории опеннета.

    Ну и часть примеров разобранных ошибок представляет собой "не опечатывайтесь в коде", "проверяйте код после копипасты", "пишите код внимательно и внимательно его перечитывайте", "форматируйте код таблчино, так его удобно читать и легче увидеть ошибки" и т.п.
    При этом автор сам опечатывается в тексте статьи.("результат работы функции memcmp() нельзя пометить в переменную"), пропускает знаки препинания, путает тире с дефисом, неправильно применяет падежи.

    Всё это в итоге вызывает ощущение, что начало и задумка были отличными, но для увеличения объёма статьи туда навставляли пачку странных примеров от КО.
    Поэтому и целевая аудитория статьи становится размытой и непонятной.

    Ежели статью поделить на две части "для тех, кто пишет первое Hello, World" и "для более  опытных", причесать форму подачи и исправить безграмотность текста, будет совсем отлично.
    Автору желаю успехов и совершенствования.

     
     
  • 4.20, тоже Аноним (ok), 11:19, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows,  Visual Studio, WinAPI и т.п.

    Автор просто не может брать примеры кода из проприетарных проектов, хотя именно они - целевая аудитория продукта. Вот и весь парадокс.

     
     
  • 5.22, Модификатор (?), 11:33, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows,  Visual Studio, WinAPI и т.п.
    > Автор просто не может брать примеры кода из проприетарных проектов, хотя именно
    > они - целевая аудитория продукта. Вот и весь парадокс.

    В таком случае у многих может возникнуть недоумение и вопрос "А при чём здесь, собственно, опеннет?!"
    ))

     
     
  • 6.27, тоже Аноним (ok), 13:39, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Да, к сожалению, думать шире одной мысли многие не умеют. Но это их проблема, а не Опеннета.
    У вас же такого вопроса не возникло? И у меня не возникло. Так чего ради нам с вами волноваться по поводу скудных мыслишек этих "многих"?
     
  • 6.34, Crazy Alex (ok), 15:05, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Да нет никких вопросов. Опеннет - возможность для этого хрена лишний раз пропиариться. Желаю ему разориться побыстрее.
     
  • 2.52, Ilya Indigo (ok), 19:52, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Вы сами-то на каких языках читаете и пишете?
    Судя по вашему комментарию, эти языки разные и не один из них не русский.
     
     
  • 3.57, Аноним (-), 20:55, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    "не один" -> "ни один"
     
  • 3.86, Модификатор (?), 13:31, 18/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Вы сами-то на каких языках читаете и пишете?
    > Судя по вашему комментарию, эти языки разные и не один из них
    > не русский.

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

    Ну и выше уже ткнули палочкой в Ваше неумение пользоваться частицами.


    "не один из них" – это "садись, 2", школьная программа не осилена.

     

  • 1.5, Онанимус (?), 10:10, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо.
     
     
  • 2.79, Аноним (-), 00:46, 17/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Спасибо.

    Пожалуйста. По существу есть что вякнуть?

     

  • 1.10, Архроним (?), 10:43, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Причина разбора и допущения большинства ошибок в коротких названиях И неоднозначных сокращениях переменных от которых рябит в глазах. Надо называть например: =  ostatochnStoimostOsnSredstv.
     
     
  • 2.11, Jock Tanner (ok), 10:49, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Надо называть FixedAssets->ResidualValue. Транслит в топку.
     
     
  • 3.12, Архроним (?), 10:49, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ну да или так.
     
  • 3.18, Philosonimus (ok), 11:11, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Кстати, а как перевести на англ. аббревиатуру - СНИЛС? inia?
     
     
  • 4.21, Jock Tanner (ok), 11:23, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    В США есть SSN (Social Security Number), но это не перевод, а примерный аналог СНИЛС. Имеет ли смысл переводить такие аббревиатуры?
     
  • 2.13, А (??), 10:51, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вам бы романы писать, а не код :)
     
  • 2.14, я (?), 10:55, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    нет, не так. ostatochnayaStoimostOS ))
     

  • 1.26, Crazy Alex (ok), 13:28, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Откуда восторг? кто-то нашёл в статье хоть что-то новое? Убогая реклама, как она есть.
     
     
  • 2.28, тоже Аноним (ok), 13:45, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Вопрос, видимо, предполагался как риторический. А зря.
    Кстати, вам, возможно, иногда стоит отключать АдБлок и вспоминать, как на самом деле выглядит убогая реклама.
     
     
  • 3.35, Crazy Alex (ok), 15:06, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Так ни строчки же того, что не пишется в учебниках. Ни одного оригинального примера - все скучны до ужаса.
     
     
  • 4.38, тоже Аноним (ok), 15:14, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Так ни строчки же того, что не пишется в учебниках.

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

     
     
  • 5.42, Crazy Alex (ok), 16:04, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Вопрос не ко мне - я под винду не пишу.

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

     
     
  • 6.44, тоже Аноним (ok), 17:08, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Напрашивается вопрос к вам: а что ж вы тогда так безапелляционно заявляете о том, в чем не разбираетесь?
     
     
  • 7.46, cmp (ok), 18:32, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Никогда в жизни не возникало ситуции, когда бы memcmp сравнивалось с -1 или 1, э... текст свёрнут, показать
     
     
  • 8.61, тоже Аноним (ok), 23:49, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну вот, еще один специалист знает предмет лучше автора, но при этом почему-то тр... текст свёрнут, показать
     
     
  • 9.66, Аноним (-), 04:08, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Не исключаю, что он и впрямь может так написать Вот только зачем ему писать ста... текст свёрнут, показать
     
     
  • 10.67, тоже Аноним (ok), 10:05, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Не исключаю, что он на этом заработал свой первый миллион Вот только нам с вами... текст свёрнут, показать
     
     
  • 11.81, Аноним (-), 00:48, 17/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Сомневаюсь, что хоть кто-то из вас, включая его, в теме, как зарабатывается милл... текст свёрнут, показать
     
  • 9.71, cmp (ok), 11:22, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Есть вопросы по теме, или сказать больше нечего... текст свёрнут, показать
     
  • 2.29, iPony (?), 13:51, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > кто-то нашёл в статье хоть что-то новое?

    Ага. Стыдно, но вообще не знал про nullptr
    Надо почитать про эти ваги модные c++v11+

     
     
  • 3.36, Crazy Alex (ok), 15:09, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    На плюсах пишете и до сих пор не прочли о "новинках" C++11? Ну да, таки надо почитать. И не только описание новинок, но и о best practices, Мейерса того же.
     
  • 3.58, Аноним (-), 21:00, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Тогда уж сразу читайте и про C++14, он, по сути, дополняет С++11. А то скоро будет C++17, всё скопом осиливать будет сложнее.
     
  • 3.87, Анонимный Алкоголик (??), 20:14, 18/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >> кто-то нашёл в статье хоть что-то новое?
    > Ага. Стыдно, но вообще не знал про nullptr
    > Надо почитать про эти ваги модные c++v11+

    Он мягко выражаясь не нужен.

     
     
  • 4.88, Анонимный Алкоголик (ok), 20:29, 18/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Он мягко выражаясь не нужен.

    (nullptr не нужен). История берёт начало с того, как в 90х дебилята внесли в документы запрет определять в C++ NULL как (void*)0. В то время как это единственно правильное его определение и есть...

     
  • 2.85, angra (ok), 08:21, 17/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Откуда восторг? кто-то нашёл в статье хоть что-то новое? Убогая реклама, как она есть.

    Это ты так пытался прорекламировать свои безграничные познания и непогрешимость как кодера? Скромнее надо быть.

     

  • 1.30, Crazy Alex (ok), 14:04, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Кстати, в п.39 автор написал полный бред, не отличив логический | от битового и накинувшись на совершенно правильный код.
     
     
  • 2.31, тоже Аноним (ok), 14:14, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Вы в данном случае себя имеете в виду? Логический | выглядит примерно так: ||.
    Ну, и использование в битовом сложении заведомого нуля - это, может быть, и рабочий код, но как-то попахивает.
     
     
  • 3.33, Crazy Alex (ok), 15:03, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Какая разница, нуль или нет? Допустим, для каких-то других случаев база была бы объявлена не в нуль, а в какую-то комбинацию флагов. И в зависимости от условия к ней доабвляется один или другой флаг. Автор статьи явно на сях сто лет не пишет, вот и пугается обычных сишных конструкций.
     
     
  • 4.37, тоже Аноним (ok), 15:12, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Зато вы, видимо, пишете на Сях так долго, что уже не помните разницы между | и ||.
    Вместо признания собственной ошибки гнать на того, кого огульно охаял - так, конечно, поступают только зрелые мужи.
     
     
  • 5.41, Crazy Alex (ok), 16:02, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Блин, протупил. Да, забыты скобки, и разные виды or здесь не важны.

    P.S. Впрочем, PVSStudio один хрен желаю скорейшей смерти, ибо проприетарщина.

     
     
  • 6.50, ы (?), 18:58, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    они совершенно бесплатно проверяют открытые проекты
     
     
  • 7.56, Led (ok), 20:52, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > они совершенно бесплатно проверяют открытые проекты

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

    //fixed

     
     
  • 8.62, тоже Аноним (ok), 23:51, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Навязчивой Вам тоже стоит хотя бы временно выключить АдБлок и откалибровать сво... текст свёрнут, показать
     
  • 6.51, Аноним (-), 19:06, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    мужик - ты наконец ответишь за свои слова?
    Ты говорил что на P970 есть новый андроид, покажи же его!
    Или мужик сказал, мужик забрал свое слово?
     

  • 1.32, Genby (?), 14:54, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    >типичных ошибок при разработке на С/С++

    надо было писать на Ada/Go/Rust/Python/Pascal

     
     
  • 2.59, Аноним (-), 21:03, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ага, а лучше на всём этом сразу и получить "типичные ошибки Ada/Go/Rust/Python/Pascal".
    Не надо искать серебряную пулю, ни один язык не застрахует вас от кривых рук и прямых извилин.
     

  • 1.43, DmA (??), 16:25, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    серьёзные разработчики думаю давно используют анализаторы.Другое дело, что закрытый код анализатора автора статьи  вдруг не проверен статическим анализатором или автор прогнал программу в обратную сторону -чтобы насажать всевозможных ошибок. В любом случае, если есть боязнь,что код утечёт  в Интернет и этим навредит программисту  лучше разрабатывать на компьютере не подключенному к сети, а то такой анализатор или компилятор вылетил с ошибкой, а потом отошлёт весь дамп системы со всем кодом куда-нибудь в Интернет...
     
  • 1.53, arka (?), 20:40, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >[оверквотинг удален]
    >
    > static int rr_cmp(uchar *a,uchar *b)
    > {
    >   for (size_t i = 0; i < 7; ++i)
    >   {
    >     if (a[i] != b[i])
    >       return a[i] - b[i];
    >   }
    >   return a[7] - b[7];
    > }

    И имеем магическую циферку 7. У нас на Юпитере sizeof(uchar) == 46, после этого расхотелось читать дальше.

     
     
  • 2.54, arka (?), 20:44, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Тьфу ты, сорри, пятница внесла в голову сумбур - "дело было не в битах, а массивах...". Удалите предыдущий коммент.
     
     
  • 3.60, ы (?), 23:00, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    вас, юпитериацев, не понять...
     

  • 1.63, Аноним (-), 00:41, 16/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Спасибо автору. Почитал, подумал, отвёл душу. Хорошо что я не один на этом свете думаю о таких вещах при написании кода. Спасибо.
     
  • 1.64, Аноним (-), 02:35, 16/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Какой ужасный пиар, какие ужасные боты в комментариях.
     
     
  • 2.68, тоже Аноним (ok), 10:10, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Да ничего ужасного, на самом деле. Просто они были по-пятничному расслаблены и искренне полагали, что их клич "Огня! Еще огня!" подхватит толпа. Так что аргументацией своих плевков не озаботились.
     

  • 1.69, Аноним (-), 10:43, 16/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Автору и создателю PVS. Когда и почему будет открыт код продукта?
     
     
  • 2.70, Аноним (-), 10:54, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    И да, спасибо за хорошую статью!
     

  • 1.72, Аноним (-), 15:03, 16/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Просмотрел наискось, и то, только половину осилил. На правах рекламы некоего PVS-Studio? "Ошибки" из разряда "для самых маленьких". Не серьезно как-то.
     
     
  • 2.73, тоже Аноним (ok), 15:35, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Там перед примерами - названия этих "самых маленьких". Временами довольно известные названия.
    Вообще, ошибке необязательно быть головоломной, чтобы представлять проблему. Особенно если на практике оказывается, что допустить такую ошибку легко, а заметить - трудно.
     
     
  • 3.74, Злюка (?), 16:18, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Такую бы энернию, да на пользу людям. 10 минут не проходит без оправдания, на любой негативный комент, по поводу довольно паршивой заказной, рекламной статейки. Всмомнилось:
    Пренебрегая словесами, Жизнь убеждает нас опять: Талантам надо помогать, Бездарности пробьются сами. :P
     
     
  • 4.77, тоже Аноним (ok), 20:44, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Приятно наконец пообщаться с культурным человеком. Может быть, вы еще и подберете аргументы к эпитету "паршивой"? Остальное возражений не вызывает.
     
  • 4.89, Аноним (-), 21:35, 18/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Такую бы энернию, да на пользу людям. 10 минут не проходит без
    > оправдания, на любой негативный комент, по поводу довольно паршивой заказной, рекламной
    > статейки. Всмомнилось:
    > Пренебрегая словесами, Жизнь убеждает нас опять: Талантам надо помогать, Бездарности пробьются
    > сами. :P

    Эти ребята регулярно проходятся по открытым проектам, сообщая разработчикам о найденных проблемах. То есть, неплохо так помогают сообществу open source. В отличие от 95% форумных комментаторов.

     
  • 3.75, Аноним (-), 18:35, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >допустить такую ошибку легко, а заметить - трудно.

    Согласен. Однако, еще труднее найти ошибку, основанную на непонимании или незнании некоторых тонких вещей, вроде работы с вещественными числами, архитектурными особенностями и пр. undefined behaviour. Это уж, если речь идет о Си и плюсах. Мне кажется, нечто подобное и ожидали увидеть те из разочарованных читателей, которые не поленились проследовать по ссылке.
    Впрочем, против предлагаемого ПО я ничего не имею, вещь, должно быть, полезная в любом случае, т.к. даже и такие "опечатки" приходится искать и править. Хорошо, если разумное участие будет при этом минимальным. Благодарю.

     
     
  • 4.76, тоже Аноним (ok), 20:40, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Дело в том, что как раз архитектурные особенности, работу с вещественными числами и пр. UB разбирают во многих учебниках. А вот напоминаний "злоупотребляя копипастой, не забывайте проверить, не пострадал ли смысл" точно ни в одном учебнике не найдешь. Мне статья кажется именно альтернативой учебникам, открывающей некоторые проблемы с не вполне академической стороны.

    Конечно, статья рекламная. Однако, на мой взгляд, статья представляет из себя тот образец рекламы, к которому нужно стремиться многим и многим. Я автору, признаться, завидую белой завистью - примерно так же, как Сергею Абдульманову, показывающему высочайший класс в рекламе "Мосигры". Наверное, поэтому и бросился лаяться с теми, кому невмочь было пройти мимо, не пнув... Хотя самому автору, подозреваю, безразличны крики на форумах - на Хабре ровно такое же бурление под каждой статьей, так там хоть аудитория побольше.

     

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



    Спонсоры:
    MIRhosting
    Fornex
    Hosting by Ihor
    Хостинг:

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