Решение принято абсолютно неверное как пишется

слово неверно краткая форма прилагательного и одновременно наречие, см. далее; правильно пишется слитно с приставкой не-. противоположное ему по

 Слово «неверно» краткая форма прилагательного и одновременно наречие, см. далее; правильно пишется слитно с приставкой «не-».

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

Грамматика

Прилагательное «неверно» – краткая форма от единственного числа среднего рода «неверное». Состоит из приставки «не-», корня «-вер-», суффикса «-н-» и окончания «-о». Постановка ударения и разделение переносами не-ве́р-но. Употребляется только в именительном падеже, но по родам и числам склоняется, причём наблюдается достаточно редкое во флективных языках явление – эмоционально-смысловой оттенок слова прямо зависит от постановки ударения:

  • неве́рен – муж. род, ед. число;
  • неверна́ – жен. род, ед. число одушевлённых предметов и «мягкий» по смыслу вариант, см. ниже;
  • неве́рна – жен. род, ед. число неодушевлённых предметов и категорический (непреклонный) смысловой вариант;
  • неверно́ – ср. род, ед. число, «мягкий» вариант;
  • неве́рно – ср. род, ед. число, категоричный вариант;
  • неве́рны – мн. число неодушевлённых предметов;
  • неверны́ – мн. число одушевлённых предметов.

От единственного числа среднего рода прилагательного «неверно» происходит совпадающее с ним по написанию качественное наречие способа и образа действия. Состав слова аналогичен, но «-о» в данном случае не окончание, а второй суффикс (или же весь суффикс «-но», здесь это безразлично). Причина «переназначения» единицы словообразования: при помощи окончаний образуются падежные формы существительных, местоимений и прилагательных, и личные формы глаголов, а наречия – неизменяемые слова. Следовательно, окончания у наречия в принципе быть не может.

Значение и употребление

Раз одно и то же слово может быть двумя самостоятельными частями речи, то из его значений как минимум два должны быть различны. Кроме того, раз в языке бытует прилагательное (или наречие) – антоним «верно» с однозначно отрицательным предлогом (частицей) «не», то и значение этого словосочетания должно в чём-то отличаться от двух первых, иначе с чего бы это вдруг писать два слова вместо одного? Итак, нам предстоит рассмотреть не менее трёх рядов значений.

Наречия

Наречия не могут изменяться по родам и числам, т.к. они неизменяемые слова. Неизменяемы они и по смыслу: наречия самостоятельные части речи, имеющие собственные значения, независимые от контекста высказывания, в которое входят. Наоборот, наречия задают смысловые оттенки фразам, потому и названы наречиями, стоящими на/над речью (лат. adverbium). Следовательно, чтобы употребить на письме «неверно/не верно», субъект высказывания (тот, кто что-то сделал не так, как надо или то, что сделано не так, как надо), должен обладать такими признаками:

А). Быть в единственном числе в виде одного объекта или чего-то цельного, неразделимого.

Б). Быть среднего рода.

В). Являться неисправимыми по существу или надёжно зафиксированными в неверном состоянии.

Отсюда следует смысловой ряд «неверно/не верно» как наречий:

  • Ложно, неправильно, ошибочно:

«Ответ указан неве́рно» – по контексту ясно, что речь идёт о тестировании. Поставил галочку или крестик не там, где надо бы – всё, провал, этот ответ в общий балл не засчитывается.

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

«Да всё, что вы тут понаписывали, неве́рно от первой до последней буквы!» – эмоциональная оценка выражена совершенно однозначно.

«Это неве́рно» – лаконичной категоричностью высказывания его автор заранее отметает возможные возражения, тем самым причисляя предмет спора к удовлетворяющим условиям А), Б) и В). Как его (высказывание) поймут, это уж его (автора) забота (или проблема), но он сказал, как хотел.

  • Если эмоциональная окраска высказывания усиливается двойным отрицанием:

«При всём моём к вам уважении, ваше мнение по данному поводу никак (никоим образом) не верно́ (не правильно)». Обратите внимание, в таком случае ударение в «верно» переносится, но в синонимическом «не правильно» остаётся на месте.

  • Антитеза «не ве́рно» в качестве наречия-антонима с отрицательной частицей употребляется, если отрицание нужно выразить предположительно или сомнительно, что в тексте обозначается вопросительной частицей «ли», которую нужно писать ПОСЛЕ значащего словосочетания:

«Валерий Лукич, а не ве́рно ли нам будет отправить сей опус на доработку, чем выискивать смысл в этой белиберде?»

Более ёмкий (по печатной площади) вариант с глаголом «быть» в прошедшем времени единственного числа 3-го лица с предположительной частицей «бы». Соотв. словесные конструкции ставятся или ПОСЛЕ предлога ДО значащего слова, или ПОСЛЕ всего значащего словосочетания:

«…не верно было бы…»; «…не было бы верно…».

Прилагательные

Прилагательное «неверно» может иметь те же значения, что и соотв. наречие (см. п. 1 перечня выше), и в этом смысле прилагается к предметам, не подходящим под условия А), Б) и В):

  • «Ваше утверждение неверно́» – культурный и воспитанный человек, ставя ударение «по-прилагательному», придаёт контексту смысл: «Я категорически против, но от дальнейшего обсуждения не отказываюсь. Если у вас есть убедительные контрдоводы – пожалуйста, я вас слушаю».

Но кроме того, прилагательные «неверно/не верно» могут иметь значения, отнюдь не совпадающие с таковыми одноимённых наречий:

  • Если нужно возразить на отдельные части предмета обсуждения:

«Пункты 5.2, 7.1 и 9.6 вашего заключения неве́рны».

  • При перечислении или его возможности неверных субъектов:

«Василий Петрович, у меня есть доказательства тому, что некоторые сотрудники предприятия неверны́ фирменной политике конфиденциальности».

  • Если предмет отрицания (сомнения) не среднего рода:

«Согласно требований действующего законодательства составленный вами акт неве́рен».

  • Для охарактеризования чего-то как неуверенного, неясного, сомнительного (синонимы):

«Я думаю, что ваше предложение неверно, так как по вашему изложению непонятно, каким образом вы учли <то-то> и <то-то. Здесь все равно, как ставить ударение, так как всё высказывание никак не категорично. Хорошая подначка для филологов-буквоедов: а пусть-ка поломаются голову – что здесь «неверно», наречие или прилагательное?

  • В том смысле – для характеристики действий одушевлённых субъектов:

«Неверно переступая по обледенелой дорожке, я всё-таки донёс лоток яиц до дома»;

«Неверно путаясь в собственных ногах, он с третьей попытки загрузился в такси»;

«Таращась на неё недоумённым взором, он неверно мотнул головой, но так ничего и не возразил».

Синоним в данном случае, кроме указанных в п. 5 – «нетвёрдо».

  • Словосочетание из предлога с прилагательным «не верно» употребляется для усиления отрицания способом введения антитезы, так сказать, переводом однократного отрицания в двойное отрицание подтверждения:

«Ваше высказывание не верно, а не правильно».

Тут опять-таки нет нужды ставить ударение, поскольку высказывания подобного рода всегда категоричны. Но сомнений насчёт частей речи в нём нет: «не верно» и «не правильно» здесь прилагательные с предлогами.

В заключение

Как видим, «неверно» и «не верно» – коварные выражения. Неверно акцентировав устную речь или сформулировав письменное предложение, вы рискуете очень нехорошим для вас недопониманием. Риск усугубляется тем, что программы набора текстов в смартфонах и планшетах большей частью не позволяют ставить ударения. Выход один: расти культурно и в грамоте, чтобы правильно, сообразно тому, что вы хотите сказать, строить фразы.

***

© ПишемПравильно.ру

Автор: Садов Артур Александрович, лингвист-типолог

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

Правописание этих слов надо знать:

Проверить еще слово:

Двухчасовой разговор президентов США и России Джо Байдена и Владимира Путина не принес прорывных решений, но дал понять: США готовы использовать самые жесткие санкции в случае военной агрессии России по отношению к Украине, говорят опрошенные Настоящим Временем политологи.

Белый дом и Кремль по-разному сформулировали итоги видеоконференции, которая прошла 7 декабря. В сообщении Белого дома говорилось, что главной темой разговора была Украина и что США и союзники ответят решительными мерами в случае агрессии. Джейк Салливан, советник президента США по национальной безопасности, заявил после переговоров, что Белый дом «готов сделать то, чего не сделал в 2014 году».

В сообщении Кремля подчеркивалось, что в ответ на заявления Байдена о наращивании российских войск у украинской границы Путин заявил, что это «НАТО предпринимает опасные попытки освоения украинской территории и наращивает военный потенциал у наших рубежей». По словам Путина, которые пересказывает сайт Кремля, это Киев тормозит выполнение Минских соглашений, совершает «провокационные действия» на Донбассе.

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

После переговоров стало известно, что Байден перенес запланированный разговор с президентом Украины Владимиром Зеленским, а министр обороны Украины Алексей Резников сказал, что в случае вторжения России ожидается «кровавая бойня».

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

Филиппенко и Крашенинников: Кремль добился того, чего хотел

— Александра, как вы думаете, довольны ли этим разговором Байдена и Путина в США?

Александра Филиппенко: Что касается США, наверное, сложно говорить за всю страну, но я предполагаю, что довольным остался по крайней мере Госдепартамент, поскольку мы понимаем, что разговор шел очень долго и, наверное, никогда так долго не разговаривали лидеры России и США, поэтому наверняка был затронут широкий круг вопросов.

Однако говорить о том, довольны ли этими переговорами в Конгрессе и довольны ли американские избиратели, очень сложно, поскольку мы знаем, что президента Трампа очень активно критиковали за его близкие связи с Россией. Что касается американских избирателей, то они с большим опасением относятся к таким близким контактам с российскими лидерами, считают, что президент Байден должен поступать жестче.

— Федор, по вашим ощущениям, этим разговором остались довольны в Кремле? Дали ли Путину какие-то гарантии, которые он просил?

Федор Крашенинников: Я просто хочу немного поддержать предыдущего оратора. Я думаю, что в США вообще не очень интересно, что там происходит, большинству людей, которые в силу своей профессиональной деятельности не занимаются политикой в Европе и в Центральной Европе, поэтому и ждать какой-то сенсации, я думаю, не стоит.

А в России я не вижу какого-то особого удовольствия по комментариям из официальных заявлений, которые мне удалось почитать. Очевидно, Путин ждал какого-то прорыва, может быть какой-то кавалерийской атаки, может, он действительно хотел, чтобы ему дали какие-то гарантии. Мне кажется, что этот разговор и не мог закончиться ничем серьезным, потому что позиции сторон слишком разные. Даже те кажущиеся уступки, о которых мы говорим, например позиция по «Северному потоку – 2», насколько я сегодня читал комментарии, в том числе немецкие, это то, что принято решение, что в случае чего этот поток остановят. Путин, по сути, остается зависящим от того, что по поводу его действий думают в Европе и в США. Если там считают, что началась агрессия против Украины, значит, остановили «Северный поток – 2». Я не понимаю, в чем здесь проблема и как это можно считать какой-то уступкой. Европе нужен газ – они газ будут получать. Как только Путин будет себя вести плохо, поставки из России будут перекрывать, будут покупать в другом месте, а Путин останется с газом, но без денег.

Я думаю, что во всех смыслах это не победа, конечно, Путина, иначе сейчас уже началось бы какое-нибудь празднование победы. Надеюсь, что через какое-то время – через несколько недель – ситуация на границе разрядится, войска отведут и ситуация вернется в какое-то нормальное русло, потому что, конечно, как писали многие другие люди, и я с коллегами согласен, вообще все эти несчастные солдатики мерзли в поле только для того, чтобы Байден все-таки позвонил Путину, они поговорили. Вот сейчас они поговорили, и это самый дорогой в истории телефонный разговор по скайпу: ради того, чтобы он состоялся, было потрачено огромное количество ресурсов, нервов, я думаю, какие-то ребята обморозились, простыли, заболели – и все ради того, чтобы Байден позвонил Путину и они пришли к выводу, что не пришли ни к каким выводам. Вот такой итог.

— Но все-таки Путин не получил никаких гарантий того, что НАТО не будет расширяться на восток? Вы уверены, что сейчас он отведет войска от границ Украины?

Федор Крашенинников: А как он может их получить? Я не очень понимаю механизм получения таких гарантий. Такие гарантии возможны только в каких-то воплях пропагандистов – Соловьев может про это кричать сколько угодно. Но насколько я прочитал заявления по итогам переговоров американских чиновников, ни о каких гарантиях неприсоединения Украины к НАТО речи вообще не идет. Речь идет о расширении помощи Украине, о том, что Украина – суверенное государство: к кому хочет, к тому и присоединяется. Это абсолютно утопическая идея, что можно каким-то образом заставить не расширяться НАТО. НАТО уже расширилось. И все эти крики, что НАТО будет близко к России, – пожалуйста, НАТО в Эстонии стоит – это 100 километров от Петербурга. И ничего страшного, стоит и стоит. Поэтому, конечно, это чисто пропагандистский лозунг, никаких гарантий таких Путину никто не может дать, не собирается давать и не будет давать.

— Александра, заявление советника Байдена о том, что США готовы сделать то, чего не сделали в 2014 году во время начала военных действий на Донбассе, аннексии Крыма. Как вы думаете, США действительно были готовы к радикальным шагам – к отключению от SWIFT?

Александра Филиппенко: Сейчас, когда действительно, я согласна с Федором, все было сделано только ради того, чтобы состоялся этот телефонный разговор, когда напряжение будет спадать, наверняка оно будет спадать, потому что Кремль добился того, чего хотел, и я абсолютно согласна с Федором, что никаких гарантий невозможно дать стране, которая не входит в Североатлантический альянс. Как она может требовать каких-то гарантий от НАТО?

Конечно, сейчас наверняка будет спад напряжения, и все, что касается отключения от SWIFT и так далее, – это возможно в случае горячей войны. Это не только возможно, но и наверняка это произойдет. Все, что касается санкций, наверняка произойдет. Но, опять же, Россия не хочет признавать себя частью конфликта. Мы знаем, что Кремль говорит о том, что это внутренний конфликт Украины, это фактически гражданская война. А переход границы Украины российскими солдатами будет просто означать, что Россия является частью этой войны, то есть официально. Мы понимаем, что де-факто так уже происходит, а это уже будет де-юре. Поэтому, конечно, возможно отключение от SWIFT, возможны и более жесткие санкции. Но в случае того, что вряд ли произойдет в Украине.

— Федор, как вы думаете, такие анонсированные санкции против России об отключении страны от системы SWIFT, насколько этого в целом боится Путин? Насколько такие угрозы могут на него вообще действовать?

Федор Крашенинников: Я хотел сказать, что это, конечно, очень мифологизированная угроза – отключение от SWIFT. Люди, которые не понимают, как все устроено, им кажется, что это какой-то козырь, которым они все побьют. Ничего радикально страшного от отключения от SWIFT на самом деле для России не произойдет. К этому давно уже готовятся. Просто это замедлит платежи между банками России и всего мира – они будут идти дольше. Но сказать, что после отключения от SWIFT завтра потухнет свет в окнах и все умрут – это, конечно, могут утверждать только люди, которые очень далеки от реальности. Поэтому преувеличивать значение отключения от SWIFT я бы не стал. И я согласен с предыдущим оратором, что такое возможно, даже такие меры, которые не сокрушат Россию, только в случае, если действительно с развернутыми знаменами российские войска перейдут границу Украины. А если это сделают какие-нибудь подразделения ЛНР и ДНР, то Россия умоет руки, скажет: «А мы-то здесь при чем? Мы никуда не заходили».

Поэтому здесь все-таки надо понимать, что экономические санкции могут быть более суровые, чем в 2014 году, когда они были очень слабые. Давайте честно скажем, что после аннексии Крыма санкции были просто легким пошлепыванием, а не санкциями. А в этот раз они могут быть очень жесткими. Но рассчитывать, что это будут какие-то санкции, которые разрушат все, тоже я бы не стал. Это будут тяжелые санкции, но не смертельные. Поэтому лучше, чтобы никакой войны не начиналось, потому что сами по себе эти санкции никого ни от чего не спасут.

— А если использовать такой термин, как «война переговоров». Как вы считаете, есть ли в этой войне переговоров победитель, Александра?

Александра Филиппенко: По моим ощущениям, Кремль добился того, чего хотел. Хотел исключительно переговоров, хотел исключительно встречи один на один. Мы понимаем, что встреча не может быть очная – онлайн-встреча с президентом Байденом один на один, которую Кремль очень хотел. Поэтому что касается войны переговоров, если мы об этом говорим, то сейчас у Кремля довольно-таки удачная позиция. Они получили то, что хотели. А дальше – дело за США. Если США будет важно подключить Россию к переговорам в Азиатско-Тихоокеанском регионе, переговорам с Китаем по размещению оружия в этом регионе, то, опять же, США смогут это сделать, учитывая, что сейчас произошли эти переговоры, говоря о том, что США пошли на некоторые уступки, в том числе отсутствие санкций по «Северному потоку – 2» – это тоже пример уступок со стороны США, которые потом они смогут использовать для переговоров России, Китая и США.

— Федор, вы уже говорили, что Путин в этом разговоре не был победителем. А был ли победитель на этой видеовстрече?

Федор Крашенинников: А почему мы должны искать победителя? Вообще переговоры – это нормальная политическая работа. А Путину очень важно показывать себя международным политиком для внутренней пропаганды, поэтому для него переговоры на высшем уровне – это нечто, что очень нужно для своих целей. В целом же это нормальная рабочая ситуация. Если бы не было такой напряженности в отношениях Запада и России, то Путин бы, и любой лидер России, должен был бы постоянно встречаться и переговариваться с коллегами по всему миру, чем, собственно, все и занимаются. Это Путин сам загнал себя в тупик, и ему получить то, что, условно, президенту Индии или президентам других стран чтобы получить, надо просто договориться о встрече, – ему приходится для этого устраивать целый цирк с конями.

Я вообще не понимаю, как в переговорах может быть какой-то победитель. Надо посмотреть, чем все это кончится, но пока я не вижу каких-то возможностей, чтобы после этих переговоров что-то случилось, чтобы потом в истории писали: «Знаменитые переговоры Байдена и Путина». Об этом, я уверяю вас, в истории точно писать никто не будет. Переговоры очень проходные, по-моему.

— А если посмотреть в будущее, означает ли то, что произошло вчера, – эта встреча – что каждый раз, когда Путин захочет поговорить с Байденом, он будет стягивать войска и угрожать войной? Как вы считаете, Александра?

Александра Филиппенко: Судя по всему, мы видим, что это уже не первый раз, когда подобное происходит. Поэтому хочется надеяться, что так не будет, но тем не менее мы видим, что договоров добиваются такими устрашающими методами – такое «принуждение к любви». Хочется верить, что дипломатия победит, но пока мы видим, что именно такие методы используются.

— Федор, а вы как считаете, в дальнейшем Путин опять будет стягивать технику к границам Украины для разговоров с Байденом?

Федор Крашенинников: Я думаю, что ему, как мальчику из анекдота, будет все сложнее этим заниматься, потому что каждый раз надо будет все больше и больше стягивать войск, чтобы ему поверили, что все серьезно. Потому что все уже поняли, что это [способ добиться] переговоров, кроме тех наших коллег, которые начинают кричать, что завтра война, и зарываться в бункеры. А в целом чтобы теперь напугать всех и сказать: «Ой, все серьезно», – надо теперь будет в два раза больше войск стащить, очевидно. А это уже технически невозможно. Поэтому, я думаю, в этой технологии есть некоторый ресурс, который Путин уже практически целиком израсходовал.

Владимир Фесенко: «Американцы на ультиматумы Путина не поддаются»

— Я сразу вас хочу предостеречь от повторения стереотипов о переговорах об Украине без Украины, потому что все ключевые кризисные ситуации в мире – не только то, что происходит на Донбассе, – в большей части обсуждаются без присутствия тех или иных стран. Данная дипломатическая практика – это неизбежность.

Но важно понимать другое. Без Украины невозможно найти решение наших проблем. И когда надо принимать решение, то его придется принимать с Украиной. Украинскую тему обсуждали с 2014 года постоянно – европейцы, американцы, – а вот решение без Украины принимать нельзя. Более того, любое решение, которое могут принять, даже с участием украинского руководителя, как это было с Минскими соглашениями, если оно не будет принято украинским обществом, то оно не будет работать.

— Вы, как и многие другие эксперты, достаточно сдержанны в оценках переговоров Путина и Байдена и считаете главным, что они вообще состоялись. Почему?

— Совершенно верно. Во-первых, никто из серьезных экспертов не ожидал каких-то прорывов и сенсаций от этих переговоров по одной простой причине – для этого не было никаких оснований и предпосылок. По Минским соглашениям в переговорах по Донбассу – просто тупик, позиция прямо противоположная. Единственное, о чем можно договариваться, – это прекращение огня. Но об этом надо договариваться в «нормандском формате» в рамках Трехсторонней контактной группы. К сожалению, Путин пока к этому не готов.

Главная тема – это эскалация российской угрозы на украинской границе. Я боюсь, что эта проблема еще на какое-то время сохранится, но мы увидели, что переговоры в принципе носили конструктивный характер и обе стороны хотят вести переговоры. А это означает, что Россия все-таки скорее пытается давить на США. Если бы Россия хотела уже сегодня или завтра начать войну, то не было бы никаких утечек, война началась бы абсолютно внезапно, как происходит в большинстве случаев. А пока это способ давления на Байдена. Но, как мы видим, американцы, и это тоже ожидаемо, на какие-то ультиматумы Путина не поддаются.

— Но при этом вы говорите, что все равно эскалация на границах еще какое-то время сохранится после этого разговора. Почему?

— Потому что у России есть ожидания, что нынешняя зима будет очень сложная для Украины. И если в Украине возникнет энергетический кризис, который, кстати, Россия пытается провоцировать, если это приведет к каким-то социальным проблемам и политическому кризису, тогда Россия может вмешаться якобы для защиты русскоязычного населения. Такой сценарий, к сожалению, возможен.

— То есть угроза вторжения все-таки остается?

— Совершенно верно. Я вам скажу, угроза вторжения России в Украину для нас всегда актуальна, начиная с 2014 года. Просто иногда она возрастает, иногда становится несколько меньше. Сейчас она достаточно высока, но не является предопределенной. Если Россия пойдет на военную операцию в Украине, то лишь при определенных внутриполитических ситуациях в нашей стране. Байден представлял консолидированную позицию Запада на переговорах с Путиным – не случайно был телефонный звонок и разговор с европейскими лидерами. Запад и США предупредили Путина о цене вторжения, заявили о возможных жестких санкциях, которые будут введены против России в случае вторжения. Вот это принципиально важно.

— Если зима будет холодная, можно ли сейчас спрогнозировать, что весной, если все будет хорошо, Путин все-таки отведет войска от украинской границы?

— Я не думаю, что он будет постоянно держать достаточно большой контингент на нашей границе. Будут перемещения войск, маневры. Многое будет зависеть от отношений с Западом, с американцами. Но как минимум дважды в год присутствие российских войск на нашей границе увеличивается – как раз весной и осенью, когда проводятся большие, масштабные учения. Будут колебания. Численность войск будет то увеличиваться, то уменьшаться в зависимости от ситуации. Но нам надо быть в постоянной готовности отражения российской атаки.

— Сегодня листал украинскую ленту новостей, и фактически все украинские медиа написали: «Байден перенес разговор с Зеленским». Это важно?

— Нет, я бы не использовал термины «перенес» и «отложил». Ситуация развивается иначе. Кто так говорит, видимо, не очень хорошо понимает дипломатическую механику. Проходят переговоры – вот были в Женеве, – после переговоров начинается деятельность рабочих групп. И сейчас то же самое, переговоры будут продолжаться и дальше. Будет и новый саммит, но все важнейшие решения и главные темы будут обсуждаться рабочими группами из профессиональных дипломатов.

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

Несмотря на это, Анюта — настоящий боец. Эта маленькая худенькая девочка, пережив несколько операций и сотни мучительных процедур, не разучилась улыбаться.

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

— Беременность у меня протекала нормально. Анализы были идеальные. Проблемы обнаружились во время третьего УЗИ, — начинает свой рассказ о борьбе за жизнь дочки Татьяна. Ее тонкие пальцы чуть подрагивают от волнения. — Врач долго водил датчиком по животу и хмурил брови. Потом позвал коллегу. Я поняла, что он увидел что-то необычное. У нас в роду были двойни. Думаю: «Может, и у меня близнецы?» Пригласили заведующую. Она начала судорожно листать обменную карту, но ничего подозрительного не нашла. Потом мне сказали, что у ребенка больное сердце…

Заведующий детским отделением кардиоцентра Тимофей Невважай (на тот момент он еще работал в Пензе) принял беременную в половине седьмого часа утра.

— Диагноз он тогда не назвал, чтобы я не накручивала себя, — продолжает Татьяна. — Написал его на листочке и отдал мужу. И это было абсолютно правильное решение. Мне и без того от страха порой хотелось кричать. А что было бы, начитайся я ужасов в Интернете?

17 сентября родилась Аня. Я так надеялась, что вот сейчас мне покажут дочку и скажут: произошла ошибка, все хорошо. Но я смогла взглянуть на ребенка лишь мельком — ее сразу же унесли.

НУЖНА ОСОБАЯ ЛЮБОВЬ

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

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

Впервые рассмотреть дочку смогла под аппаратами: тельце, опутанное трубками, глазки-щелочки (были сильные отеки), но такая родная!

Через месяц их выписали домой.

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

Чего-чего, а родительской любви Ане хватило с лихвой!

В пять месяцев над сердцем девочки снова колдовали пензенские кардиохирурги. Они провели операцию Гленна. Родителей предупредили, что через несколько лет понадобится еще одна — Фонтена.

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

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

Иногда, увидев на улице Аню, прохожие выговаривали маме: «До чего довели ребенка! Сколько же вы с ней гуляли на морозе? Губы как черника, а вы все домой не идете…».

— Разве я могла каждому объяснить, что у Ани больное сердце? — вздыхает Татьяна. — Да и не принято у нас во всеуслышание заявлять, что ты не такой, как все. Дочкин шов от операции я долгое время старалась прятать под кофточками с высоким горлом.

В ПОИСКАХ ВЫХОДА

Родители стали искать путь к спасению дочери. Изучали опыт врачей по всему миру, списывались с клиниками. С помощью благотворителей собрали средства на поездку в Голландию. Увы, и там за операцию Фонтена не взялись, но поставили фистулу, чтобы девочке было легче дышать.

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

— Посмотри, у меня тоже шрам от операции на сердце. Я как ты. Мы сильные. Не бойся. У тебя тоже все будет хорошо.

С тех пор Аня не прятала шрама.

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

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

— Даже писать Ане было тяжело — не могла сильно нажимать ручкой на бумагу.

Тем временем специалисты помогли Сидоровым найти кардиохирурга, который берется за самые сложные случаи. Но доктор Дель Нидо работал в Америке, в бостонской клинике. Операцию он готов был провести в два этапа. И первый стоил больше 15 миллионов. А в мире свирепствовала пандемия…

Где найти деньги? Как получить визу? Проблемы, казалось бы, неразрешимые для семьи, где мама сидит с ребенком-инвалидом, а папа — простой автослесарь. Но Татьяна запретила себе впадать в уныние. Никакого «а если…».

— Разве у нас есть выбор? Будем собирать деньги.

ЧУДЕСА СЛУЧАЮТСЯ

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

В отчаянии Сидоровы обратились к Марии Петровне Гаврюшиной, руководителю Пензенского отделения Российского детского фонда. Та бросила клич везде где только можно. История Ани попала на телевидение, в социальные сети. И сбор на первый этап операции был закрыт!

Не остался в стороне и глава РДФ — писатель Альберт Лиханов. Он перечислил на счет 100 тысяч рублей — полученную им Лермонтовскую премию. А еще фонд помог с деньгами на дорогу и с оформлением визы.

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

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

И вот Сидоровы в клинике Бостона. Самые сложные часы родители Ани пережили, пока шла операция. Они показались вечностью.

— Когда вышел врач и сказал, что все хорошо, что операцию Фонтена удалось провести в один этап, я бросилась к нему и стиснула его в объятиях. Такие проявления эмоций в Америке не приняты, но меня переполняло счастье.

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

ЭТОТ УДИВИТЕЛЬНЫЙ МИР

Мама осторожно будит Аню — ей пора пить утреннюю таблетку. Девочка по-прежнему вынуждена принимать лекарства по часам, ведь реабилитация после такой операции долгая, а организм годами приспосабливался к неправильной работе сердца.

— Наконец-то у дочки нормальные, теплые ладошки! — ласково касается руки девочки Татьяна, радуясь еще одной победе.

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

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

— Кем ты хочешь стать, когда вырастешь, Аня?

Девочка теряется. Долгое время ей было не до нормальных детских фантазий о будущем.

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

Потом мы вместе смотрим фото и видео в телефоне Татьяны. В памяти мобильника останутся первые прогулки после операции.

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

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

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

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

Лариса Гулина

«Пензенская правда», 9 ноября 2021 г.

Оригинал и другие интересные статьи на сайте издательства «Пензенская правда»

В Облдуме обсудили законопроект о мелиорации земель: Инициатива регулирует правоотношения в части кадастрового учета мелиоративных сооружений.

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

По словам заместителя министра экономического развития, промышленности и торговли региона Сергея Мазепы, в настоящее время бесхозяйными являются 545 км проводящих мелиоративных каналов Калининградской области. Для проведения реконструкции и дальнейшего введения в эксплуатацию их требуется поставить на кадастровый учет. Однако региональное управление Росреестра не рассматривает такие объекты в качестве недвижимого имущества, поэтому зарегистрировать права на них практически невозможно. 

В июле текущего года губернатор обратился в адрес председателя правительства с просьбой решить данную проблему на законодательном уровне. В результате правительством Калининградской области была подготовлена указанная версия проекта федерального закона.

1opi43v1a9t4tno0d81wyq1ncab1cpsy

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

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

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

Кроме того, проектом устанавливается возможность осуществления кадастрового учета систем и сооружений в упрощённом порядке — по декларации на объекты до 1 января 2025 года.

Отвечая на вопрос депутата Андрея Оноприенко, Сергей Мазепа пояснил, что изымать объекты у собственников власти не планируют. «Сервитут, в том числе публичный, для обслуживания этих объектов будет установлен. Но, мне кажется, собственник самого земельного участка напрямую заинтересован в том, чтобы мелиоративная система на его участке работала по назначению», — добавил он.

c104f935d9ac538dcb83ccef708c584cПредседатель комитета Валерий Губаров поинтересовался, как будут регистрироваться объекты, находящиеся на территории государственного лесного фонда. Он отметил, что земли данной категории обычно ставятся на учет общей площадью, каналы из них не вымежевываются. Таким образом, мелиоративные объекты потребуется переводить в земли водного фонда.  

Замминистра сообщил, что предложенный законопроект не разделяет земли на категории. «До настоящего времени продолжается работа по нормализации сведений ЕГРН и ГЛР, где земельные участки как раз приводятся в соответствие, чтобы их площади соответствовали учтенным в гослесфонде. Поэтому они могут как выводиться оттуда, так и включаться», — добавил он.

«Но там эти объекты не надо изымать вместе с землей, в этом же вся проблема. Вот у нас канал идет мелиоративный. Мы сейчас деньги выделяем, начинаем чистить канал, упираемся в лес — и всё. Там целая проблема, чтобы всё согласовать, чтобы в этот лес зайти. А там он заросший деревьями — каждое дерево попробуй сруби. Невозможно это сделать. А дерево числится», — возразил Губаров.

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

«На сегодняшний день очевидно, тот путь который предлагается, то есть отдельное правовое регулирование статуса мелиоративных каналов и других мелиоративных систем независимо от того, по каким землям они проходят, наверное, это единственно правильный подход. Потому что иначе, если мы будем учитывать особенности правового регулирования различных земель, мы еще там в земли обороны можем уйти, в земли промышленности. Тогда мы в принципе вообще никогда не придем к регулированию статуса вот этих мелиоративных объектов. Дело в том, что на сегодняшний день пока кто в лес, кто по дрова. И поэтому при подготовке к проведению мелиоративных работ мы постоянно сталкиваемся вот с этой ситуацией правовой неопределенности», — подчеркнул он, заявив что «концептуально законопроект имеет право на существование».

0f184152407badc9bb6c3d187686b71aДепутат Сергей Лютаревич предположил, что к законопроекту «придётся “делать ноги”, и не одни». 

«Могу сказать, что закон дерзкий, потому что реально навести порядок в рамках мелиорации — сверхзадача. Конечно, если мы не подстрахуемся нашими депутатами в областной Думе, это будет невозможно. Поэтому я его поддерживаю абсолютно. Мы к нему подходили еще раньше, и у нас не получилось ничего, потому что реально это очень много затрагивает интересов других министерств, собственников земель. Разные земли и разные люди…», — добавил он.

Текст: Марина Кошечкина
Фото: RUGRAD.EU 

Язык Си — один из наиболее влиятельных языков программирования за всю историю. Он стал незаменимым инструментом разработки операционных систем, сместив с этого пьедестала языки ассемблера. Изучение Си обязательно для любого уважающего себя программиста. Этот язык любим за свою внешнюю простоту и ненавидим за беспощадность к ошибкам. Благодаря ему у нас есть ядро Linux и тысячи уязвимостей в нём же в придачу. Попробуем понять, что же такое этот противоречивый язык Си — благословение или проклятие?

История языка Си берёт свое начало в недрах американской компании Bell Labs и тесно связана с судьбой операционной системы UNIX. Ее создатели, Кен Томпсон и Деннис Ритчи, разрабатывали свой проект для компьютеров PDP-11, и первые два года их основным инструментом был язык ассемблера. Трудоёмкость написания машинного кода вынуждала искать ему замену, которой в конечном итоге и стал язык Си. С его помощью было полностью переписано ядро операционной системы и большая часть утилит. Язык Си позволял создавать эффективные низкоуровневые программы на PDP-11, практически не используя при этом язык ассемблера.

Со временем встал вопрос портирования UNIX на новые аппаратные платформы. Использование языка Си значительно упростило эту задачу. Ведь если бы в разработке применялся только язык ассемблера, то тогда операционную систему пришлось бы переписывать под каждую компьютерную архитектуру. С другой стороны, исходники UNIX все еще содержали немало кода, созданного специально для компьютера PDP-11. Да и сам язык Си далеко не всегда точно отражал особенности и детали той или иной аппаратной платформы. Последнее еще больше затрудняло процесс переноса и лишало язык одного из его главных достоинств — прозрачной и понятной генерации машинного кода. Чем больше компьютерных архитектур захватывал Си, тем менее очевидной становились его связь с низким уровнем.

В процессе миграции UNIX на новые аппаратные платформы обнаружилась ещё одна проблема. Портированные программы на языке Си исполнялись медленнее, нежели можно было от них ожидать. Чем сильнее отличалась целевая компьютерная архитектура от PDP-11, тем менее эффективным был получаемый код. Чтобы скомпенсировать этот недостаток, разработчики компиляторов всё чаще стали применять неявные оптимизации. И хотя такое решение и улучшало производительность самих программ, Си всё больше отдалялся от низкого уровня. Теперь приходилось не только понимать, как именно определялись конструкции языка для каждой из компьютерных архитектур, но также и то, как они оптимизировались. Разумеется, любой компилятор самостоятельно решал, как именно транслировать исходный код для каждой аппаратной платформы. В итоге написать на языке Си низкоуровневую программу, независящую от используемого компилятора, стало практически невозможно.

Необходимо было понять, как эффективно реализовать высокоуровневые конструкции языка Си, сохранив при этом его низкоуровневые свойства. Попыткой решить эту проблему стала публикация в 1989 году первого стандарта языка. Его принято называть «ANSI C» или «C89», и именно на него мы будем ссылаться в дальнейшем. Создатели стандарта решили окончательно разорвать связь Си с архитектурой PDP-11 и сделать язык полностью высокоуровневым. Была введена так называемая «абстрактная машина» — воображаемый исполнитель кода на языке Си (раздел 2.1.2.3, «Program execution»):

Семантические описания в этом Стандарте описывают поведение абстрактной машины, в которой вопросы оптимизации не имеют значения.

Это означает, что оптимизации компилятора не будут влиять на работу программы, пока её исходный текст согласуется со стандартом. Абстрактная машина должна была решить две проблемы одновременно. Во-первых, следование стандарту давало возможность создавать легко переносимые программы на языке Си. Во-вторых, абстрактная машина могла предоставить компиляторам свободу для оптимизаций. Вот только возникает вполне резонный вопрос — а чем тогда язык Си отличается от любого другого компилируемого языка высокого уровня? Ответ кроется в тексте стандарта. Чтобы всё-таки дать теоретическую возможность программистам писать низкоуровневые процедуры, а значит непереносимые, было введено ещё одно понятие — неопределённое поведение (undefined behavior, раздел 1.6, «DEFINITIONS OF TERMS»):

Неопределённое поведение — поведение при использовании непереносимой или ошибочной программной конструкции, ошибочных данных или объектов с неопределёнными значениями, для которых стандарт не накладывает никаких требований. Возможное неопределённое поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами, поведения во время трансляции или выполнении программы задокументированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения трансляции или выполнения (с выдачей диагностического сообщения).

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

Возьмём следующий фрагмент кода на языке Си:

int x = 1;
x = x << sizeof(int) * 8;

Попробуем предположить, какой результат у нас получится. Допустим, мы скомпилировали этот код для процессоров архитектуры ARM. Инструкция битового сдвига в рамках этой аппаратной платформы определена так, что итоговым значением переменной «x» должен быть «0». С другой стороны, мы можем транслировать нашу программу в машинный код архитектуры x86. И уже там битовый сдвиг реализован таким образом, что значение «x» не изменится и останется равным «1». Мы могли бы сделать вывод, что результат работы данного фрагмента кода зависит от того, для какой аппаратной платформы мы его скомпилировали. Но на самом деле это не так.

В действительности данный фрагмент кода может быть обработан компилятором любым возможным и невозможным образом. Причина в следующем: согласно тексту стандарта языка Си битовый сдвиг на величину, большую или равную размеру выражения в битах, является неопределённым поведением. Получается, нет никакой гарантии, что этот кусок кода вообще будет работать. В действительности, даже в рамках одной архитектуры один и тот же компилятор может сгенерировать совершенно разные исполняемые файлы. Приведём примеры компиляции и запуска программы с печатью значения переменной «x». В обоих случаях мы используем компилятор gcc версии 10.2.1 для целевой архитектуры x86-64.

$ cat test.c
#include <stdio.h>

int main()
{
    int x = 1;
    x = x << sizeof(int) * 8;
    printf("%dn", x);
    return 0;
}
$ gcc test.c -o test
$ ./test
1
$ gcc -O test.c -o test
$ ./test
0

Флаг «-O» разрешает компилятору gcc использовать оптимизации исходного кода. То, какие именно механизмы оптимизации могут быть применены, а также какие флаги за них отвечают, зависит от конкретного компилятора. В общем случае невозможно узнать, каким образом будет обработано неопределённое поведение в программе при трансляции исходного кода. Поэтому единственный способ написания переносимых программ на языке Си — это полное избегание неопределённого поведения при разработке.

Рассмотрим чуть более сложный пример. Ещё одной разновидностью неопределённого поведения является разыменование нулевого указателя. Его тривиальным вариантом будет следующий фрагмент кода:

* (char *) 0;

Разумеется, никто в здравом уме не станет писать что-то подобное в своей программе. Однако совсем необязательно делать разыменование нулевого указателя явным образом, чтобы вызвать неопределённое поведение. В цикле статей «What Every C Programmer Should Know About Undefined Behavior» на сайте blog.llvm.org приводится фрагмент кода, подтверждающий это:

void contains_null_check(int *p)
{
    int dead = *p;
    if(p == 0)
        return;
    *p = 4;
}

Пример может показаться надуманным, но он позволяет немного лучше понять работу компилятора языка Си. Последний использует различные механизмы оптимизации, но здесь нам интересны лишь два. Один из них удаляет лишний, «мертвый» код, а второй вычёркивает бесполезные проверки на нулевой указатель. Если к вышеописанному фрагменту кода будет применён первый механизм оптимизации, то он преобразует функцию следующим образом:

void contains_null_check(int *p)
{
    if(p == 0)
        return;
    *p = 4;
}

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

void contains_null_check(int *p)
{
    int dead = *p;
    if(0)
        return;
    *p = 4;
}

Так как мы разыменовываем указатель до его проверки, то компилятор спокойно решает, что сам указатель никогда не будет нулевым. Благодаря этому сравнение «p == 0» заменяется на выражение, всегда возвращающее ложь. Затем компилятор запускает первый механизм оптимизации и убирает «мертвый» код:

void contains_null_check(int *p)
{
    *p = 4;
}

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

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

Оптимизации компилятора могут затрагивать также и функции стандартной библиотеки языка Си, в том числе, к примеру, memset. Она широко и печально известна за обилие ошибок, которые допускают программисты при её вызове. Заголовок функции выглядит следующим образом:

void *memset(void *ptr, int value, size_t num);

memset записывает «num» байтов со значением «value» по адресу «ptr». Несмотря на то, что параметр «value» имеет тип int, в действительности используется лишь его младший байт. Функция активно применяется для обнуления больших массивов данных, однако компилятор и сам частенько любит вставить её вызов туда, где это нужно и не очень. Так, любопытный случай обсуждался 15 апреля 2018 года на форуме osdev.org. Пользователь под ником ScropTheOSAdventurer создал тему, в которой рассказал о процессе разработки собственной учебной операционной системы. На свою беду он разрешил компилятору оптимизировать исходный код проекта, в результате чего последний перестал работать. В процессе отладки программист обнаружил ошибку в следующем фрагменте кода:

void *memset(void *ptr, int value, size_t num)
{
    unsigned char *ptr_byte = (unsigned char *) ptr;
    for(size_t i = 0; i < num; ptr_byte[i] = (unsigned char) value, i++);
    return ptr;
}

Для своей операционной системы разработчик решил использовать собственную реализацию функции memset. Но он не учёл, что в процессе трансляции компилятор gcc обнаружит в этом коде весьма заманчивую возможность для оптимизации. Фактически функция была в итоге преобразована к следующему виду:

void *memset(void *ptr, int value, size_t num)
{
    return memset(ptr, value, num);
}

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

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

int check_password(const char *pwd)
{
    char real_pwd[32];
    get_password(real_pwd);
    return !strcmp(pwd, real_pwd);
}

Есть лишь одна проблема — после вызова check_password в стеке останется строка с настоящим паролем пользователя. Если в вашей программе есть хотя бы одна уязвимость, позволяющая читать данные из памяти, то существует реальная вероятность украсть пароль из стека. Примером подобной уязвимости стал печально известный баг «Heartbleed». Чтобы снизить возможные риски, проще всего очистить содержащий пароль фрагмент стека:

int check_password(const char *pwd)
{
    int result;
    char real_pwd[32];
    get_password(real_pwd);
    result = !strcmp(pwd, real_pwd);
    memset(real_pwd, 0, sizeof(real_pwd));
    return result;
}

Казалось бы, решение найдено, однако не все так просто. Искушённый в вопросах оптимизации компилятор может решить, что вызов memset здесь лишний, и спокойно удалит его из тела функции. Действительно, для работы самой программы это действие абсолютно бесполезно. Что ещё хуже, компилятор может сгенерировать код, в котором пароль окажется в одном из регистров процессора. В таком случае получить его, используя уязвимость в программе, может оказаться еще проще. И у вас даже не получится заставить компилятор очистить содержимое регистра. Более подробно о данной проблеме можно прочитать по ссылке.

Одной из наиболее коварных разновидностей неопределённого поведения является strict aliasing. Термин может быть переведён как «строгое наложение», однако традиционного названия на русском языке у него не существует. По этой причине мы будем использовать оригинальный английский термин. Текст стандарта дает такое описание для strict aliasing (раздел 3.3, «EXPRESSIONS»):

Значение объекта должно быть доступно только с помощью lvalue-выражения одного из следующих типов:

— объявленный тип объекта,

— квалифицированная версия объявленного типа объекта,

— знаковый или беззнаковый тип, соответствующий объявленному типу объекта,

— знаковый или беззнаковый тип, соответствующий квалифицированной версии объявленного типа объекта,

— тип массива, структуры или объединения, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член внутренней структуры, массива или объединения),

— символьный тип.

Проще всего strict aliasing проиллюстрировать на конкретном примере:

int x = 42;
float *p = &x;
*p = 13;

Чтобы вызвать неопределенное поведение, достаточно обратиться к какой-либо переменной по типу, несовместимому с объявленным. Это ограничение можно обойти, применив символьный тип (char), на который не распространяются правила strict aliasing:

int x = 42;
char *p = &x;
*p = 13;

Вот только расчленение переменной на символы может оказаться трудоемкой задачей. Придется учитывать размер данных, а также используемый порядок байтов. Избежать неопределённого поведения можно также с помощью объединений (union):

union u { int a; short b };
union u x;
x.a = 42;
x.b = 13;

Впрочем и этот метод не лишён недостатков — объединение должно содержать члены со всеми возможными типами, которые будут использованы программой. Все это серьёзно осложняет применение «type punning» или так называемого каламбура типизации — намеренного нарушения системы типов. Эта техника необходима для более гибкого низкоуровневого управления памятью машины.

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

int get_pixel(const char *buf, int width, int x, int y)
{
    buf += get_header_size(buf);
    return ((const int *) buf)[y * width + x];
}

При вызове функции ей передается адрес области данных с содержимым файла, включая его заголовок, ширину изображения, а также координаты пикселя, цвет которого следует вернуть. Вместо типа int мы могли бы выбрать любой другой с известным нам размером. Но все это неважно, потому что функция get_pixel абсолютно неверна с точки зрения стандарта, так как нарушает правила strict aliasing. Чтобы использовать каламбур типизации, придется переписать весь код, связанный с используемым буфером, в том числе и тот, который ответственен за чтение файла.

Существует огромное количество примеров программ, не удовлетворяющих правилам strict aliasing. В их число входит знаменитая функция вычисления быстрого обратного квадратного корня из игры Quake 3:

float FastInvSqrt(float x)
{
    float xhalf = 0.5f * x;
    int i = *(int *) &x;
    i = 0x5f3759df - (i >> 1); /* What the fuck? */ 
    x = *(float *) &i;
    x = x * (1.5f - (xhalf * x * x));
    return x;
}

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

Остается один вопрос — зачем вообще нужен этот strict aliasing? Все дело в том, что он позволяет создателям компиляторов применять крайне агрессивные оптимизации исходного кода. Правила strict aliasing распространяются на обращения к любой памяти, в том числе и динамической. Так комитет стандартизации отметил, что следующий фрагмент кода (источник):

void f(int *x, double *y)
{
    *x = 0;
    *y = 3.14;
    *x = *x + 2;
}

может быть преобразован таким образом:

void f(int *x, double *y)
{
    *x = 0;
    *y = 3.14;
    *x = 2;
}

Согласно правилам strict aliasing указатель y не может содержать адрес того же участка памяти, что и указатель x. Именно этот факт и позволяет заменить выражение «*x = *x + 2» на «*x = 2». Активное использование компиляторами подобных оптимизаций сломало огромное количество старого кода. Так, в письме от 12 июля 1998 года один из разработчиков компилятора gcc Jeff Law, отвечая на вопросы по strict aliasing и связанными с ним ошибками, пишет (источник):

> Существует очень много кода, который нарушает правила strict aliasing. Одним из таких примеров является «переносимая» универсальная функция контрольной суммы IP, которая содержится в исходных кодах BSD для работы с сетями.

ИМХО, такого кода становится все меньше и меньше — современные компиляторы уже какое-то время используют strict aliasing в анализе, в результате чего люди были вынуждены исправлять свой код. Безусловно, это не относится к Linux и некоторым другим свободным проектам, так как они используют только gcc.

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

Укажите им на стандарт языка Си :-) :-)

Правила strict aliasing для компилятора gcc можно разрешить, используя флаг «-fstrict-aliasing», и запретить флагом «-fno-strict-aliasing». Последний рекомендуется применять, если вы не уверены, нарушаете ли вы текст стандарта — скорее всего, нарушаете. Говоря об упомянутом в письме ядре Linux, его автор Линус Торвальдс также дал свою оценку strict aliasing в частности и работе комитета в целом. Так, критикуя желание одного из разработчиков операционной системы лишний раз перестраховаться от нарушения стандарта, Линус написал такое письмо (источник):

Честно говоря, все это кажется мне сомнительным.

И я не о самих изменениях — с этим я могу смириться. Но вот обоснование этих самых изменений — абсолютная и полная чушь, причем весьма опасная.

Дело в том, что использование объединений для реализации каламбура типизации — это обычный и СТАНДАРТНЫЙ для этого способ. В действительности он является документированным для gcc, и используется в том случае, если вы, будучи не слишком умным (оригинал: «f*cking moron»), применили «-fstrict aliasing», и теперь вам необходимо избавиться от всего того ущерба, который навязывает этот мусорный стандарт.

Энди, что послужило причиной для всего этого идиотизма? И не надо говорить мне, что текст стандарта «недостаточно ясный». Текст стандарта, совершенно ясно, является дерьмовой чушью (см. выше о правилах strict aliasing), и в таких случаях его нужно игнорировать. Для этого необходимо использовать средства компилятора, чтобы избежать ущерба. Аналогично нужно поступать и в ситуациях, где нет полной ясности.

Это то, почему мы используем «-fwrapv», «-fno-strict-aliasing» и другие флаги.

Я уже говорил об этом раньше и повторю еще раз: когда текст стандарта противоречит реальности — он является обычным куском туалетной бумаги. Он не имеет абсолютно никакой важности. В действительности, вместо него я лучше возьму рулон настоящей туалетной бумаги — так хотя бы я не испачкаю свою задницу чернилами (оригинал: «won’t have splinters and ink up my arse»).

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

Впрочем, одним лишь strict aliasing стандарт не полон. Чтобы вызвать неопределённое поведение, необязательно даже разыменовывать указатель:

void f(int *p, int *q)
{
    free(p);
    if(p == q) /* Undefined behaviour! */
        do_something();
}

Использование значения указателя после того, как память по нему была освобождена, запрещено текстом стандарта (раздел 4.10.3, «Memory managment functions»):

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

Программисту важно понимать, что указатели в Си не являются низкоуровневыми. Стандарт постарался полностью искоренить какую-либо связь языка с реальным миром. Даже сравнение указателей, ссылающихся на разные объекты, объявлено неопределённым поведением (раздел 3.3.8, «Relational operators»):

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

Вот небольшой фрагмент кода, демонстрирующий некорректное с точки зрения стандарта сравнение:

int *p = malloc(64 * sizeof(int));
int *q = malloc(64 * sizeof(int));
if(p < q) /* Undefined behaviour! */
    do_something();

Однако наиболее интересным примером здесь будет служить исходный код следующей программы:

#include <stdio.h>

int main()
{
    int x;
    int y;
    int *p = &x + 1;
    int *q = &y;
    printf("%p %p %dn", (void *) p, (void *) q, p == q);
    return 0;
}

Если транслировать приведенный выше текст компилятором gcc, передав ему флаг «-O», то полученный исполняемый файл при запуске выдаст примерно следующую строку:

0x1badc0de 0x1badc0de 0

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

Большая часть примеров, связанных с работой указателей, была взята с сайта kristerw.blogspot.com. На нём вы сможете найти больше информации о текстах стандарта языка Си, а также загадочных оптимизациях компиляторов.

Может показаться, что в случае выключенных оптимизаций все вышеописанные проблемы обойдут вас стороной. Просто не передавайте компилятору флаг «-O», и вы получите тот результат, на который рассчитываете. Но на самом деле это не так. В январе 2007-ого года на сайте gcc.gnu.org пользователь под ником felix-gcc выложил исходный код следующей программы:

#include <assert.h>

int foo(int a) {
  assert(a + 100 > a);
  printf("%d %dn",a + 100, a);
  return a;
}

int main() {
  foo(100);
  foo(0x7fffffff);
}

Функция foo проверяет на переполнение сумму поданного знакового числа и константы «100». Как известно, на подавляющем большинстве компьютерных архитектур отрицательные числа задаются в виде дополнительного кода. В случае переполнения такое число меняет знак на противоположный, благодаря чему проверка «a + 100 > a» возвращает ложь. В теле функции main felix-gcc дважды вызывает foo. Сначала он подает на вход число, которое не приведёт к переполнению. Затем, исходя из того, что размер типа данных int равен четырем байтам, felix-gcc вызывает foo с наибольшим положительным числом данного типа. Логично предположить, что в таком случае сравнение вернёт ложь, и assert прервёт работу программы. Однако вот какой вывод получил felix-gcc после запуска исполняемого файла:

200 100
-2147483549 2147483647

Фактически gcc решил удалить проверку на переполнение, и это при том, что никаких флагов компилятору передано не было. И что еще интереснее, ранние версии gcc при тех же условиях не убирали проверку, в результате чего получаемая программа вела себя иначе. На резонную просьбу felix-gcc исправить неожиданный баг компилятора ответил пользователь под ником Andrew Pinski. Будучи разработчиком gcc, Andrew Pinski заметил, что данное поведение не является ошибочным. Более того, он сам оказался автором изменения в коде компилятора, которое и создало столь странный результат. Далее приводится фрагмент диалога felix-gcc и Andrew Pinski. Комментарии излишни:

Andrew Pinski
Переполнение знакового числа — это неопределённое поведение в тексте стандарта языка Си, используйте беззнаковый тип или флаг «-fwrapv».

felix-gcc
Вы должно быть шутите?
Различные проблемы безопасности вызваны переполнениями чисел, и вы просто так говорите мне, что в gcc 4.1 я больше не могу тестировать их для знаковых типов? Вы явно чего-то не понимаете. ДОЛЖЕН быть способ обойти эту проблему. Существующее программное обеспечение использует знаковые числа, и я не могу просто поменять тип на беззнаковый — мне все равно нужно проверить переполнение! Не похоже, что я мог бы использовать какой-нибудь обходной путь для этого. Что вы хотите от меня — чтобы я привел тип к беззнаковому, сдвинул вправо на один, затем сложил или что вообще?!
ПОЖАЛУЙСТА, ОТМЕНИТЕ ЭТО ИЗМЕНЕНИЕ. Оно создаст СЕРЬЁЗНЫЕ ПРОБЛЕМЫ БЕЗОПАСНОСТИ во ВСЕВОЗМОЖНЫХ ПРОГРАММАХ. Меня не волнует, что ваши стандартизаторы говорят о том, что gcc исправен. ВСЕ ЭТО ПРИВЕДЁТ К ТОМУ, ЧТО ЛЮДЕЙ ВЗЛОМАЮТ. Я обнаружил эту проблему, так как одна из проверок безопасности, которая предотвращает взлом, провалилась.
ЭТО НЕ ШУТКА. ИСПРАВЬТЕ ЭТО! СЕЙЧАС ЖЕ!

Andrew Pinski
Я не шучу, стандарт языка Си прямо говорит, что переполнение знакового числа — это неопределённое поведение.

felix-gcc
Так, послушайте, Эндрю, вы что, действительно думаете, что эта проблема исчезнет, если вы продолжите закрывать баги достаточно быстро? Проверка, которую я написал, покрывала все возможные ситуации. Не требуется даже уточнения того, что за тип используется — указатель, беззнаковое или знаковое число. Ну, указатели вы тоже сломали, но ваши изменения были исправлены. Парень, который сделал это тогда, должен появиться здесь, нам нужен кто-то с трезвой головой и видением ситуации как у него.
Давайте посмотрим правде в глаза — вы облажались по полной (оригинал: «fucked up this royally»), и теперь вы пытаетесь прикрыть все ошибки как можно скорее, чтобы никто не заметил, сколько ущерба вы нанесли. Вы, сэр, непрофессиональны и позорите команду разработчиков gcc. Эта ошибка останется открытой до тех пор, пока вы не вернёте все обратно или не сделаете упомянутый вами флаг по умолчанию. Пока вы будете ломать программы, чьи авторы по глупости включили оптимизации, мне всё равно. Но я не позволю вам делать моё окружение менее безопасным только потому, что ваш непрофессионализм не позволяет вам разобраться с оптимизациями после того, как было показано, что они наносят больше вреда, чем пользы. Сколько еще доказательств вам необходимо предоставить? Боже мой, да autoconf считает, что ваши «оптимизации» нужно отключать повсеместно. Вы вообще замечаете взрывы вокруг самих себя?

Andrew Pinski

http://c-faq.com/misc/sd26.html

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

felix-gcc
МОЙ КОД НЕ СЛОМАН.
Попытки обесценить проблему или оскорбить меня ничего не решат.

Andrew Pinski
Вы написали ошибку, поэтому я и решил, что ваш код сломан.

felix-gcc
Итак, скажите мне, какая часть моей аргументации вам непонятна? Я мог бы использовать слова попроще, чтобы вы смогли меня понять на этот раз.
Ребята, ваша задача — это не просто реализовать стандарт Си. Вы также обязаны не нарушать работу программ, которые зависят от вас. А от вас зависит МНОГО программ. Когда вы нарушили точность вычислений с плавающей точкой, то вы сделали это доступным с помощью флага (-ffast-math). Когда вы добавили strict aliasing, вы так же сделали эту функцию доступной через флаг (-fstrict-aliasing). Если я правильно помню, вы тогда тоже цитировали текст стандарта, пока люди с более адекватным пониманием мира вас не остановили. И я собираюсь оставить эту ошибку открытой до тех пор, пока не повторится та же история.

Andrew Pinski
Я думаю, нам не следовало делать это необязательным, но меня не было в тот момент, когда было принято это решение. Также помните, что у нас был релиз, когда strict aliasing был включен, но затем нам пришлось его отключить по умолчанию. За это время люди исправляли свои программы, пока оптимизация была активна. И мы уже сделали оптимизацию знакового переполнения опциональной с помощью «-fwrapv». Я не понимаю, к чему вы приводите свои аргументы.

felix-gcc
Вы не можете просто так потенциально сломать кучу свободного ПО лишь потому, что изменили свое мнение по поводу того, какую свободу вам дает стандарт.
Повзрослейте или уйдите, позволив более ответственным людям заниматься вашими делами.

Andrew Pinski
Подождите, но эта оптимизация была еще с 1994-ого года, и если какой-либо код, начиная с этого момента, использовал знаковое переполнение, то авторы этих программ сами напросились.

felix-gcc
Знаете ли вы, что ракета Ариан-5 взорвалась (и могла убить людей!) из-за ошибки переполнения? Что если люди погибнут из-за того, что вы решили, что стандарт позволяет вам выкидывать проверки безопасности, написанные людьми?

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

felix-gcc
Еще раз: НЕ ИМЕЕТ ЗНАЧЕНИЯ ТО, ЧТО ГОВОРИТ СТАНДАРТ. Вы сломали программы, и люди пострадали от этого. Теперь верните все обратно. Меньшее, что вы можете, это сделать «-fwrapv» по умолчанию. Вам все еще придётся заставить его работать правильно (я слышал, что он неверно работает в определенных ситуациях), но это уже другая история.

Andrew Pinski
Он будет по умолчанию в тех языках, где определено именно такое поведение. Я дал вам способ написания проверок переполнения, и если вам не нравится то, что говорит стандарт языка Си, то это не моя вина.
Запомните: компилятор gcc также является оптимизирующим компилятором, и если вам нужны оптимизации, то вы должны следовать правилам того языка, на котором вы пишете, вместо создания неверных программ, что и происходит с Си и Си++ в целом.

felix-gcc
В ранних версиях компилятора такое поведение происходило только в случае включённых оптимизаций. Если немножко присмотреться, то окажется, что все ваши аргументы ничего не стоят.
Потому как gcc 4.1 выкидывает этот код уже без включённых оптимизаций. Вот и все ваши аргументы.
Пожалуйста, сделайте «-fwrapv» по умолчанию, и я заткнусь.

Andrew Pinski
Попробуйте проверить время исполнения программы с «-fwrapv» и без него. Вы увидите, что без него код работает быстрее.

Пытаясь уйти в обсуждение оптимизаций компилятора, Andrew Pinski решил тем самым оправдать свою позицию. В процессе он, однако, упомянул куда более «интересную» аргументацию:

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

А в самом конце обсуждения Andew Pinski заявил следующее:

Я бы принял вашу идею о включении «-fwrapv» по умолчанию, если бы не существовало способа для проверки переполнения до того, как оно случилось, но он есть. Да, мы сломаем код, который был написан, исходя из предположения о том, что знаковое переполнение возможно. Но я думаю, что это та цена, которую мы можем принять.

В заключение хочется привести еще одну цитату Линуса Торвальдса:

Разработчики gcc больше заинтересованы в попытках выяснить, что еще им позволяет делать стандарт, чем в том, как заставить вещи действительно работать.

И в этом, похоже, заключена главная проблема языка Си. Но подобное не могло произойти на пустом месте — в конечном итоге мы сами позволили этому случиться. Язык Си уже очень давно перестал выполнять возложенные на него функции и превратился в уродливую пародию на самого себя. Но мы этого не заметили, потому что смирились с тем, что наши программы не работают. Мы, как программисты, настолько привыкли к ошибкам, что они стали неотъемлемой частью нашей жизни. Зачастую на отладку и тестирование программ уходит больше времени, чем на проектирование и написание самого кода. И ведь это немудрено — людям свойственно ошибаться. Большую часть багов и уязвимостей программисты вносят случайно, совершенно не задумываясь, и мы ничего не можем с этим сделать. Однако неизбежность ошибок не оправдывает их существование. Задача программиста в том, чтобы писать код, который работает. Даже если это неочевидно, трудно и невозможно, мы не имеем права делать ошибки. Потому что иначе все бессмысленно, и мы перестаем понимать, что можно делать, а что нельзя, что красиво, а что уродливо. В погоне за эффективностью разработчики компиляторов забыли о том, для чего на самом деле нужен язык Си. Он инструмент программиста, а плохим инструментом нельзя написать хорошую программу. Эта история — показательный пример того, что не всякая деятельность плодотворна, и не каждое изменение ведет к лучшему результату. Стараниями комитета стандартизации и разработчиков компиляторов мы в конечном итоге потеряли язык Си. Как инструмент разработки он стал абсолютно бесполезен и даже вреден, и мы обязаны признать это. В противном случае наши программы никогда не будут работать. Пренебрежительное отношение к ошибкам должно уйти в прошлое, а вместе с ним должен умереть и язык Си.

P.S. Если вы все ещё верите, что язык Си можно спасти, ознакомьтесь по ссылке со следующей выдержкой за авторством одного из двух редакторов текста стандарта языка Си:

Мы позволим компилятору лгать вам. Мы будем лгать вашему коду. И когда дела пойдут плохо — ошибка, «обосратушки», утечка памяти — мы торжественно покачаем головами.

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

Соавтор статьи: @aversey

Изначальная публикация: cmustdie.com

  • Решение задач как правильно пишется
  • Решение проблемы смысла жизни в романе отцы и дети сочинение
  • Решаемая как пишется правильно
  • Речь царевны из сказки о мертвой царевне и семи богатырях 5 класс
  • Речь это бесценный дар данный человеку сочинение