LINUX.ORG.RU

Сообщения aureliano15

 

Три очка!

Всех с 21 числом 21 года 21 века! 21 — это очко, кроме того, 21 == 7 * 3, и оба этих числа счастливые. Но в данном случае это не просто 21, а тройное 21, что в 3 раза счастливее одиночного! Вы уже подняли за это бокал спирта?!

Да, Линукс тут … в общем, не знаю, причём тут Линукс. Скорее всего ни при чём. Так что если что, сносите, но я не мог не напомнить сообществу о столь редком природном явлении. Если кто-то не успеет отметить сегодня, то у него/неё есть ещё 11 дней в этом году для отмечания оного праздника. А потом всё. Что-то сопоставимое по масштабам произойдёт только через 100 лет, в 2122 году. Но там всё будет ровно наоборот: 3 чётных числа 22, не разлагающихся на простые счастливые числа 7 и 3. И главное — это будет уже не очко, а перебор.

 

aureliano15 ()

Закрывают Горбушку.

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

Наверно, сегодня она уже не так актуальна, как когда-то. Но всё-таки это поздне-советская и пост-советская история, а также один из брендов Москвы. А если вспомнить, что до Горбушки в этом здании был завод Рубин, то история намного более давняя, чем пост-советская и даже поздне-советская. Когда ко мне приезжали иногородние друзья, они сразу рвались на Горбушку, если им была нужна электроника. И на мои возражения, что в Москве есть места и подешевле, отвечали, что Горбушку они знают, и что вообще дело не в цене, а в олдскульности.

В общем, может это и оправдано, но мне жаль, хотя сам я, даже бывая в тех краях, чаще захожу в ТЦ «Филион», чем на «Горбушкин двор».

А Линукс тут при том, что на Горбушке когда-то можно было купить cd/dvd с разными дистрибутивами Линукс, а также разное железо под Линукс.

 , , ,

aureliano15 ()

Двойное уведомление при ответе на моё сообщение с одновременным кастом - это фича или баг?

Вот получил 2 уведомления на 1 сообщение Ноут за пять рублей (комментарий) . Одно, как ответ на мой камент, а второе из-за явного каста. Не то чтоб меня это как-то напрягло, но по-моему ещё недавно такого не было. Например, в аналогичном случае fdisk -l - значения в таблице (комментарий) я получил только одно уведомление. Т. е. в движке явно что-то изменилось с 11 ноября 2020, в результате чего он стал в таких случаях уведомлять дважды. Вот я и спрашиваю, фича это или баг? Если что, то лично мне фиолетово.

 ,

aureliano15 ()

А почему бы для разнообразия не открыть хотя бы на время клуб?

Вот @leave удалил такую весёлую танцпольную тему https://www.linux.org.ru/forum/talks/16094144 . Понятно, что всё по правилам, и претензий нет. Но ведь есть клуб, куда её можно перенести. Тем более, что срач в теме по ЛОРовским понятиям более чем умеренный. А в клубе уже очень давно ничего не было. Или нет?

 ,

aureliano15 ()

Северное сияние в Москве и Питере 9 — 11 декабря.

Не хочется спамить, но для широт Москвы, да и Питера, явление действительно редкое. Возможно, уже сегодня. Так что все горожане, кому интересно, срочно за город. Ну а у кого не получится, может и из города что-то будет видно в северной части неба. Подробнее https://naukatv.ru/news/severnoe_siyanie_mozhno_budet_uvidet_na_shirote_peterburga_i_dazhe_moskvy , https://daily.afisha.ru/news/44815-v-moskve-i-peterburge-mozhno-budet-uvidet-severnoe-siyanie-ego-vyzovet-silneyshaya-magnitnaya-burya/ .

 ,

aureliano15 ()

Юпитер и Сатурн — сверхблизкое соединение

Вот получил письмо из рассылки с астрофорума. Я конечно понимаю, что и другие, кто подписан на рассылку, его получили. Но вдруг есть такие, кто на рассылку не подписан, а ночное небо иногда наблюдает? Для них и публикую, потому что событие действительно очень редкое. У меня, правда, с балкона наблюдать его вряд ли получится, даже если небо 21 декабря будет ясным.

Юпитер и Сатурн — СВЕРХблизкое соединение

Есть астрономические события не то что редкие, а редчайшие. Нет, я не о ярких кометах и солнечных затмениях...

Здравствуйте! С вами Алексей Сельянов из «Звездочёта».

Есть астрономические события не то что редкие, а редчайшие. Нет, я не о ярких кометах и солнечных затмениях. Это всё, конечно, явления нечастые, но не такие уж необычные. А вот то, что нас ждёт в декабре — можно сказать, из ряда вон…

Последний раз это явление наблюдалось почти 800 лет назад, в начале марта 1226 года. В Киеве тогда правил князь Владимир Рюрикович, во Владимире — князь Юрий Всеволодович, в Переславле-Залесском — князь Ярослав Всеволодович, отец Александра Невского.

Тогда явление наблюдалось утром, а в декабре 2020 года нам предстоит увидеть его вечером. О чём же идёт речь?..

СВЕРХблизкое соединение Юпитера и Сатурна

Речь идёт о соединении Юпитера и Сатурна, точнее даже СВЕРХблизком соединении. Произойдёт оно 21 декабря. В этот день планеты окажутся на минимальном расстоянии друг от друга — всего 6′, это 1/5 диска Луны!

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

Разрешение человеческого глаза составляет около одной угловой минуты. Поэтому в одну звезду планеты не сольются, но 20-22 декабря при наблюдениях невооружённым глазом, в лучах ярко сверкающего Юпитера, заметить находящийся рядом более чем в 10 раз слабый по блеску Сатурн будет не так просто.

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

Низкое расположение планет над горизонтом серьезно осложняет и съёмку через телескоп. А вот красивые пейзажные фотографии получить будет легко. Особенно классно сделать такую фотку 17-18 декабря, когда рядом с планетами будет проплывать лодочка молодой Луны.

Кстати, к наблюдениям приступать можно прямо сейчас. Ждём захода Солнца и вперёд! Чем южнее проживаете — тем больше продолжительность видимости. А вот чем севернее, тем ниже планеты располагаются у горизонта, тем хуже и короче видимость. На широтах около 60° и чуть севернее планеты можно попытаться найти с помощью бинокля в сумерках, сразу после захода Солнца. А вот севернее 65°, если честно, «ловить нечего» — всё очень низко.

Я, конечно, понимаю, что у нас что ни месяц, то каждый раз какое-то редкое астрономическое явление, но здесь случай особенный. Не пропустите! Следующее соединение Юпитера и Сатурна будет уже только в 2040 году, а потом аж в 2060. Но расстояния будут совсем не те — почти целый градус, т.е. в 10 раз больше. А когда будет так же, как в это раз? Считайте сами, если в прошлый раз это было 800 лет назад, то следующий… В общем, и думать даже не хочется!

 , , , ,

aureliano15 ()

Вопрос по бесплатной почте.

Вот такой дурацкий вопрос. Нужна ссылка на бесплатный буржуйский (т. е. НЕ российский/НЕ украинский/НЕ СНГ) почтовый сервис, который не требует телефон, работает с smtp и imap, более-менее стабильный, более-менее давно существующий, более-менее безопасный. Параноидальная безопасность мне не нужна. Но вот захожу на разные буржуйские сервисы, а там в лучшем случае сертификат не на тот адрес зарегистрирован, а в худшем — вообще нет https как класса. Т. е. все пароли — открытым текстом. Вот без такого безобразия, ну и с защитой почтовых протоколов (веб-интерфейс мне неинтересен). Всякие gmail’ы и yahoo не годятся из-за того, что спрашивают телефон.

Никто не подкинет ссылок?

UPD: В общем, итоги исследования малоутешительны: из всех перечисленных в каментах на данный момент (18:47) бесплатных буржуйских сервисов реально работают по imap/smtp и продолжают регистрировать, не требуя телефона, только cock.li, забаненный в России, но доступный через tor, и, возможно, майкрософтовский live.com, который я не проверил. Ещё я самостоятельно нашёл https://account.riseup.net/user/new , но он требует инвайта от уже зарегистрированных пользователей. Воспользовался cock.li. Спасибо всем, кто ответил по существу!

 , ,

aureliano15 ()

Вас взломали! (спамеры)

Привет, ЛОР!

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

Received: from [31.13.144.92] (port=42288 helo=mailer.abw.by)
Subject: Оповещение
X-PHP-Originating-Script: 1001:class_mail.php
From: Вас взломали! <no-responce@banando.ru>
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-Priority: 3
X-Mailer: vBulletin Mail via PHP
Date: Thu, 3 Sep 2020 06:16:23 +0300

3дрaвcтвуйте! У меня для Вас плохие новости. Уже довольно давно я получил доступ к Вашему устройству через которое вы посещаете интернет и все это время наблюдаю за вами. Всему виной сайты для взрослых на которые вы посещали.

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

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

Поэтому вот мое предложение. Вы переводите сумму эквивалентную 650 долларам на мой биткоин кошелек и мы забываем друг о друге, а все данные и видео я удаляю навсегда. Поверьте, это очень скромная сумма за мои труды. Как купить биткоин вы легко сможете найти при помощи поисковых систем по типу yandex или google Мой биткоин-кошелек (btc-wallet): 1LDyrT6i2M77BWBqUpenYUZ1UamLptURh6

На оплату у вас 50 часов, это более чем 2 суток, так что времени вполне достаточно. В письме был встроен таймер, который начнёт отсчёт, после того как Вы открыли письмо и я буду знать сколько времени у Вас осталось Отвечать мне бессмысленно - адрес генерируется автоматически, жаловаться тоже, письмо не может быть отслежено как и биткоин адрес. Я не делаю ошибок. Если я обнаружу, что вы каким-то образом поделились этим сообщением - видео будет немедленно распространено. Удачи и не держите зла. У каждого своя работа.

Ради любопытства посмотрел по адресу https://traceer.co/btc/address/1LDyrT6i2M77BWBqUpenYUZ1UamLptURh6/, перевёл ли кто-то что-то этому товарищу, и таки да, нашлось два безмозглых онаниста, которые перевели сегодня суммарно (вдвоём) 0,11782513 BTC, что по текущему курсу чуть меньше $1270 или 95637 руб.

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

UPD от 4 сентября:

Уже склонялся было забить на всё, но прочитав камент товарища mexx, подумал: а ведь правда. И пошёл в ментовку. Заяву у меня приняли, отправили в кабинет к оперу, который ещё раз меня опросил, всё напечатал и дал расписаться, что де с моих слов напечатано правильно. А потом у нас состоялся примерно такой разговор:

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

- Чтобы мошенников меньше стало.

- А на смс'ки подобные ты тоже каждый раз заявы пишешь?

- Ну там-то рублей по 200, а здесь аж по 650 баксов собирают, и в день 100 - 150 тыр. на один кошелёк выходит, т. е. уже мошенничество в крупном размере.

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

- Как нет? Уже минимум пятеро (на тот момент) повелись.

- Так пусть они за себя заявы и пишут.

- Так по отношению ко мне тоже покушение на мошенничество было, а это - статья.

- Ну да, может и откроют.

В общем, я понял, что шансы на то, что кто-то что-то будет делать, близки к нулю.

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

- И вы что, реально 650 баксов отдали?

- Да нет конечно.

В общем, как-то так. Если будет продолжение, отпишусь в этой теме или создам новую. Но вряд ли оно будет.

UPD #2 от 20 сентября:

Ну вот и конец истории. Вчера получил официальное письмо с отказом в возбуждении дела. Процитирую его частично (выделения - мои):

По данному материалу проверки было принято решение об отказе в возбуждении уголовного дела в связи с отсутствием события преступления. [skip]

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

В материале проверки отсутствуют признаки состава преступления

и т. д. Это как признаки преступления могут формально присутствовать и одновременно отсутствовать? И какие необходимы документы для всесторонней проверки и принятии решения по фактам? Письмо в электронном виде со всеми заголовками я им передал. Не иначе, расписка от мошенников. Впрочем, в повествовательной части письма среди прочего было такое:

на его электронную почту пришло письмо от неизвестного ему гражданина, в котором сообщалось, что на его компьютер был установлен вирус «Тоян»

Так что думаю, что если бы они и взялись за это дело, то раскрыть его у них вряд ли получилось. Ведь Тояны - такие Тояны!

Ну и ещё сообщается, что я могу обжаловать это постановление прокурору или в суд. Ага! Делать мне больше нечего.

Эксперимент завершён, результат отрицательный, но, как любят говорить учёные, «отрицательный результат - тоже результат».

 

aureliano15 ()

chroot vs lxc (docker) vs kvm vs etc для установки arch и opensuse на debian-хосте

Привет, ЛОР!

Вот задумался на довольно жирном ноуте (16 Гб RAM с возможностью расширения до 32 гиг и с 4-ядерным i7) поставить несколько дистров: в качестве хоста debian для работы, отдыха и вообще для души + arch и opensuse для разных сомнительных экспериментов. Понимаю, что комп довольно жирный, но не считаю это поводом без нужды загружать ресурсы. Соответственно, какую виртуальную среду для гостевых систем лучше выбрать, чтоб было и максимально легко, и гибко, и, главное, надёжно и стабильно (но с учётом того, что ни от кого, кроме как от себя, мне защищаться и изолироваться не нужно). Сам склоняюсь к старому доброму chroot'у, но может лучше lxc или вообще kvm? Напишите свои соображения, у кого они есть. Может, бывают какие-то подводные камни, о которых я не подумал? Каков будет реальный выигрыш от chroot и реальный проигрыш от kvm? А может есть что-то намного лучше, чего я не назвал? В общем, вопрос, безусловно, холиварный, но хотелось бы услышать побольше мнений лоровских экспертов.

Заранее благодарю за ответы.

 , , , ,

aureliano15 ()

Лучшее средство от похмелья

Британские Китайские учёные считают лучшим средством от похмелья газированный лимонный сок (источник). А вы запаслись на новогоднее утро лимонами с газировкой?

Линукс тут при том, что лимоны эти, если ими вовремя запасутся все опен-сорс разработчики во всём мире, помогут сэкономить миллионы человеко-часов головной боли, что потенциально может вылиться в сотни миллионов строк качественного опенсорсного кода под Линукс в течение всего одного дня. А сколько этих бесцельно прожитых дней головной боли!

 , , , ,

aureliano15 ()

А вы знаете, что компания SplashData в исследовательских целях брутфорсит ваши пароли?

Названы худшие пароли 2018 года

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

Каждый год компания SplashData их изучает и публикует список самых худших и небезопасных паролей. В этом году ей удалось собрать список целых 100. Среди них есть как старые и узнаваемые 11111, qwerty и password, так и новые, например, неожиданно в списке появилось имя президента США donald.

Приводим 25 самых популярных (новые комбинации выделены жирным):

( читать дальше... )

 ,

aureliano15 ()

А как вы относитесь к Галичу и что вообще слушаете?

Вот сегодня, буквально только что, на 1-ом канале был концерт, посвящённый 100-летию Галича. Я никогда не любил Галича (кроме песни про Парамонову, которая мне очень нравится). Вот Визбора очень люблю и как поэта ставлю его даже выше Окуджавы. Окуджаву, разумеется, тоже очень люблю. Высоцкого вообще все любят, и я не исключение. А вот Галича не очень. Имхо, он был чересчур политизирован, и это ему мешало. И юмор получался какой-то тяжеловесный и сиюминутный (по типу «утром в газете, — вечером в куплете»), кроме «Парамоновой», и лирика какая-то не совсем лиричная. И сейчас посмотрел концерт и не изменил своего мнения. А что любит народ на ЛОРе? В плане поэзии и музыки в сочетании с поэзией (т. е. нормальные тексты, а не «ду-ду-ду, мир спасать иду», какая бы музыка в этом «ду-ду-ду» ни была)?

И да, Линукс тут ни при чём. И Галич, и Высоцкий, и Визбор умерли до его появления. Окуджава умер после, но, подозреваю, даже не слышал этого слова. Так что если кто-то сочтёт это оффтопиком — смело удаляйте и уменьшайте скор, потому что это и есть оффтопик. Но это очень онтопичный оффтопик, ведь не Линуксом единым...

 , ,

aureliano15 ()

Всё пропало!

Завершены переговоры между Линусом Торвальдсом, создателем ядра операционной системы Linux и владельцем одноименной торговой марки, и тремя крупнейшими производителями ПО по продаже торговой марки Linux.

По утверждению Register.co.uk, в продолжавшихся более полугода переговорах о переуступке прав на торговую марку Linux участвовали три крупнейших разработчика программного обеспечения - компании Apple, Microsoft и IBM.

Как сообщает Register.co.uk, Линус Торвальдс не подтвердил факт завершения переговоров. Несмотря на это, Register сообщает, что соответствующее заявление будет сделано уже на этой неделе.

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

источник https://news.softodrom.ru/ap/b2741.shtml

 , , , ,

aureliano15 ()

Каковы критерии подтверждения/неподтверждения топиков в галерее?

Вот есть рабочее место (не моё) Избушка гентушников. Обзор бункера. . Имхо, очень красивое, с аквариумами, линуксом и живым попугаем. Висит оно уже 5 дней (с 14 числа) и до сих пор не подтверждено. За это время в галерее успело появиться ещё 2 подтверждённых, хоть и намного менее экзотических рабочих места, а всего подтверждённых верхних постов в галерее за это время появилось целых пять. За это же время индусские программисты успели накодить около 20 миллиардов строк кода, китайцы произвели 250 тысяч автомобилей, Россия выбрала нового старого президента... а рабочее место на ЛОРе всё ещё не подтверждено и, видимо, не будет. А каков критерий? Чем появившиеся позже, однако уже подтверждённые два рабочих места лучше? Просто интересно.

 , ,

aureliano15 ()

Космические вирусы — уже не фантастика

Ученые испугались сообщений из космоса

источник https://hi-tech.mail.ru/news/uchyonye_ispugalis_soobscheniy_iz_kosmosa/

Джон Лернед из Гавайского университета (США) и Майкл Хиппке из Зоннебергской обсерватории (Германия) в своем совместном труде под названием «Межзвездные коммуникации и невозможность обезвреживания сообщений» предостерегли человечество от необдуманных контактов с внеземными цивилизациями.

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

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

Наиболее вероятным типом межзвездного сообщения, считают ученые, является послание «Космический вызов», сделанное радиотелескопом РТ-70 в Крыму. Оно представляет собой ряд двоичных символов, которые расшифровываются в виде рисунка. Если сообщение распечатать на бумаге для дальнейшего анализа, то вред может представлять только заложенный в нём смысл, но при использовании для декодирования компьютера есть риск его заражения вредоносным кодом.

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

 , , , ,

aureliano15 ()

О неопределённом поведении и багах оптимизатора clang на примере разбора цикла статей Криса Латтнера, разработчика clang.

про ud2 - лень читать комменты - но кто-то должен был оставить вот этот цикл из трех постов:

http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html

stevejobs, спасибо за ссылки. С интересом почитал. Ответ получился довольно длинным, даже движок форума не хочет принимать его в таком виде в качестве простого камента, поэтому я решил, что он тянет на отдельную тему. Тем более, что здесь разбирается не какой-то мелкий баг/фича clang'а, а общий подход к созданию оптимизатора, основанный на изложении и анализе статей одного из разработчиков этого компилятора Криса Латтнера (Chris Lattner). Ну и ещё мне пришлось полностью переписать один из его примеров, чтоб он начал работать и иллюстрировать излагаемые им идеи. Если хочешь, можешь послать ему код, чтоб вставил в свою статью вместо своего, не рабочего. Я не возражаю.

А для тех, кто не в теме, это продолжение темы Вызов никогда не вызываемой функции.

Основная мысль автора цикла статей, как я понял, выражена ближе к концу 3-ей статьи в короткой фразе:

c) is a lot of work to implement.

Т. е. автор, по сути, соглашается, что они реализовали какую-то дичь с этими оптимизациями, объясняя некоторые причины: что де оптимизатор не знает, что на входе получает компилятор и даже не знает, что получает он сам на предыдущем проходе, ну и некоторые другие причины. А в конце говорит: но переделывать эту неудачную архитектуру нам лень, поэтому пользуйтесь тем, что есть. Что ж, fixed. В любом случае, статьи полезны, т. к. проливают свет на реальное (и довольно печальное) положение дел, связанных с оптимизациями в компиляторе clang.

Теперь разберу примеры из статей.

1. В первом примере автор пытается показать, почему к указателю на int нельзя обращаться как к указателю на float:

float *P;
 void zero_array() {
   int i;
   for (i = 0; i < 10000; ++i)
     P[i] = 0.0f;
 }

int main() {
  P = (float*)&P;  // cast causes TBAA violation in zero_array.
  zero_array();
}

Этот код — полная дичь. Он будет вылетать и с оптимизациями, и без них, потому что в переменную P (которая по умолчанию инициализируется 0), записывается её собственный адрес, а дальше, начиная с этого адреса, записываются ещё 40000 байт, которые непременно выдут за границы выделенной памяти.

Я немного переделал этот пример, чтоб он заработал, добавив сразу после P массив достаточного размера, в который и будут записываться числа (тоже undefined, но по факту работает с обоими компиляторами — clang и gcc), и заменив запись 0 на запись адреса &P+1, для чего ввёл объединение ufp, т. к. иначе на первой же итерации P будет указывать на 0, после чего на 2-й итерации произойдёт сегфолт. Ну и ещё добавил printf'ы для вывода информации и return, как того требует gcc и стандарт. Тут же отмечу, что мне пришлось слегка повозиться с unsigned *p, объявленным внутри функции print_array(). Сначала я сделал его глобальным, объявив до указателя float *P, и получил похожий на приведённый, но не совсем верный вывод: вместо ожидаемого 0x601268, 0x0, 0x0, 0x601268 программа без оптимизаций выдавала 0x601268, 0x0, 0x601268, 0x0. После установки watchpoint'а в дебагере выяснилось, что массив повторно модифицируется функцией print_array(). Просмотр адресов глобальных переменных &P и &p показал, что и clang, и gcc вставляют p после P и перед массивом arr, хотя в тексте программы она была объявлена первой. Видимо, компиляторы зачем-то сортируют переменные по типам и располагают указатели на float раньше указателей на unsigned. После переноса unsigned *p внутрь функции, всё стало работать, как и ожидалось. Вот мой рабочий (хоть и намеренно некорректный) вариант:

#include <stdio.h>

float *P;

float arr[10000];

union ufp
{
  float** p; float f;
} fp={&P+1};

void zero_array() {
   int i;
   for (i = 0; i < 10000; ++i)
     P[i] = fp.f;
 }

void print_array() {
   int i;
   unsigned *p;
   printf("&P==%p, P==%p\n", &P, P);
   for(i = -2; i < 10000; ++i)
    {
      p=(unsigned*)P;
      printf("&P[%i]==%p, P[%i]==%f (%p: 0x%X)\n", i, &P[i], i, P[i], p+i, *(p+i));
    }
}

int main() {
  P = (float*)&P;  // cast causes TBAA violation in zero_array.
  zero_array();
  //P=(float*)(&P+1); // restoring P for optimizer
  print_array();
  return 0;
}

При компиляции clang'ом без оптимизации:

clang -o zero_array zero_array.c

этот вариант выдаёт следующее:

&P==0x601260, P==0x601268
&P[-2]==0x601260, P[-2]==0.000000 (0x601260: 0x601268)
&P[-1]==0x601264, P[-1]==0.000000 (0x601264: 0x0)
&P[0]==0x601268, P[0]==0.000000 (0x601268: 0x0)
&P[1]==0x60126c, P[1]==0.000000 (0x60126c: 0x601268)
&P[2]==0x601270, P[2]==0.000000 (0x601270: 0x601268)
&P[3]==0x601274, P[3]==0.000000 (0x601274: 0x601268)
&P[4]==0x601278, P[4]==0.000000 (0x601278: 0x601268)
[skip]
&P[9994]==0x60ae90, P[9994]==0.000000 (0x60ae90: 0x601268)
&P[9995]==0x60ae94, P[9995]==0.000000 (0x60ae94: 0x601268)
&P[9996]==0x60ae98, P[9996]==0.000000 (0x60ae98: 0x601268)
&P[9997]==0x60ae9c, P[9997]==0.000000 (0x60ae9c: 0x601268)
&P[9998]==0x60aea0, P[9998]==0.000000 (0x60aea0: 0x601268)
&P[9999]==0x60aea4, P[9999]==0.000000 (0x60aea4: 0x601268)

и корректно завершается.

Если же включить оптимизацию:

clang -o zero_array -O2 zero_array.c

то получаем следующее:

$ ./zero_array
&P==0x601260, P==0x60126800601268
Ошибка сегментирования

Кстати, такой же результат будет, если откомпилировать эту программу компилятором gcc с включённой оптимизацией (там только адреса будут немного другими). Избавиться от этой ошибки можно 2 способами:

  1. Закомментировав вызов print_array() в функции main().

    Очевидно, что в этом случае никакого вывода мы не получим.

  2. Раскомментировав в main() строчку
    P=(float*)(&P+1); // restoring P for optimizer

    Тогда мы получим такой вывод:

    &P==0x601260, P==0x601268
    &P[-2]==0x601260, P[-2]==0.000000 (0x601260: 0x601268)
    &P[-1]==0x601264, P[-1]==0.000000 (0x601264: 0x0)
    &P[0]==0x601268, P[0]==0.000000 (0x601268: 0x601268)
    &P[1]==0x60126c, P[1]==0.000000 (0x60126c: 0x601268)
    &P[2]==0x601270, P[2]==0.000000 (0x601270: 0x601268)
    &P[3]==0x601274, P[3]==0.000000 (0x601274: 0x601268)
    &P[4]==0x601278, P[4]==0.000000 (0x601278: 0x601268)
    [skip]
    &P[9994]==0x60ae90, P[9994]==0.000000 (0x60ae90: 0x601268)
    &P[9995]==0x60ae94, P[9995]==0.000000 (0x60ae94: 0x601268)
    &P[9996]==0x60ae98, P[9996]==0.000000 (0x60ae98: 0x601268)
    &P[9997]==0x60ae9c, P[9997]==0.000000 (0x60ae9c: 0x601268)
    &P[9998]==0x60aea0, P[9998]==0.000000 (0x60aea0: 0x0)
    &P[9999]==0x60aea4, P[9999]==0.000000 (0x60aea4: 0x0)
    

Проблема тут очевидна: в цикле в P[i] записывается адрес &P+1. Но указатель P указывает на самого себя благодаря присвоению P = (float*)&P. Соответственно, элемент P[0] находится по тому же адресу, что и P. Когда при 1-й итерации цикла мы записываем туда адрес следующего элемента, указатель P меняется. В 64-битной ОС размер указателя равен 8 байтам, а размер float — 4, т. е. P у нас теперь указывает на начало arr. Дальше мы записываем 1-ый элемент от нового начала массива, т. е. по сути 3-й элемент, пропуская таким образом 2 элемента.

Когда же мы включаем оптимизатор (и в clang, и в gcc), он записывает все двойные слова подряд, начиная с 0-ого (в P[-1] у нас 0 потому, что мы перезаписали его после вызова zero_array(), чтобы программа не вылетела при вызове print_array()). Поэтому в первых 2 элементах у нас записано число 0x601268 (если представлять его как беззнаковое целое длиной в 4 байта), но 1-ые 2 элемента одновременно являются адресом, на который указывает P, т. е. адресом 0x0060126800601268 (0x601268 повторенное 2 раза). Если ничего не выводить, то всё тоже проходит успешно. Но как только мы вызываем print_array() (не модифицировав этот дикий адрес), программа сразу пытается отобразить содержимое не валидного адреса 0x601268, а того самого 0x0060126800601268, которого в нашем адресном пространстве просто нет. И получает сегфолт.

Почему printf отображает значения с плавающей точкой, которые в целочисленном виде выглядят как 0x601268, нулями, а не NAN, как по идее должно бы было быть, я не знаю. Видимо, это баг стандартной библиотеки (надо будет послать багрепорт, если никто мне не объяснит, что они правы).

Кстати, оба компилятора по неведомым мне причинам при оптимизации (а я пробовал разные уровни оптимизации) почему-то вместо записи поля fp.f memset'ом продолжают генерить цикл, только более короткий, чем без оптимизации (ассемблерные листинги я тут приводить не буду, кому интересно, могут сами откомпилировать с опцией -S). Хотя при записи константы 0 компилятор clang с вкючённой оптимизацией вместо цикла вызывает memset (gcc и в этом случае генерит цикл).

На всякий случай укажу версии использованных компиляторов:

$ clang --version
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: x86_64-pc-linux-gnu
Thread model: posix

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.

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

c) is a lot of work to implement.

Такие они, разработчики clang'а.

Но идею я понял: при заполнении массива 0 или другими значениями в цикле, опасно одновременно менять указатель на этот массив. Но при чём тут изначальное утверждение о том, что

It is undefined behavior to cast an int* to a float* and dereference it (accessing the «int» as if it were a «float»).

Как это утверждение иллюстрируется данным примером?

Я уже не говорю о том, что оптимизировать циклы в memset нет никакой необходимости, потому что программист и сам может это сделать, сократив не только получившийся бинарник, но и исходник. А если программисту до этого нет дела, то почему компилятору должно быть дело? Тем более, если программист сделал цикл намеренно, то компилятору совсем незачем это исправлять. Думаю, именно поэтому gcc и не сворачивает циклы в memset. Я уже не говорю о том, что если уж вы сворачиваете их в memset, то будьте последовательны. Почему при заполнении массива константой 0 вместо цикла clang вызывает memset, а при заполнении того же массива одной не меняющейся переменной длиной в 4 байта оставляет цикл? Грош цена такой оптимизации.

Вот заменить вызов memset на ассемблерную команду rep stos действительно было бы полезно, но почему-то ни clang, ни gcc этого не делают.

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

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

Очевидно, что если передать функции contains_null_check() NULL, то код будет непереносимым (undefined behavior). В защищённом режиме при попытке разыменования такого указателя произойдёт сегфолт. (UPD: практически аналогичная ошибка в ядре Linux 2.6.30 и 2.6.18 для Red Hat привела к серьёзной уязвимости, причём при разыменовании указателя система не падала.) Однако в реальном режиме такой код вполне законный. Более того, если мы рассматриваем язык си как системный язык, то в некоторых случаях без подобного кода в реальном режиме не обойтись. Что у нас лежит по адресу 0 в реальном режиме? — Указатель на обработчик 0-ого прерывания (деление на 0). А что если я хочу зарегистрировать свой обработчик? Для этого и существует неопределённое поведение: в одних системах оно работает так, а в других иначе. Но разработчики clang'а считают, что «неопределённое поведение» — это индульгенция на генерацию разного бреда вместо нормального кода.

Но вернёмся к статье. Автор описывает 2 варианта поведения оптимизатора.

  1. В первом варианте сначала проверяется избыточный код, а затем избыточные проверки. Выглядит это примерно так:
    void contains_null_check_after_DCE(int *P) {
      //int dead = *P;     // deleted by the optimizer.
      if (P == 0)
        return;
      *P = 4;
    }
    

    На этом этапе совершенно справедливо выпилили переменную dead, т. к. она нигде не используется.

    Далее идёт проверка избыточности проверок и делается правильный вывод о том, что проверка P на равенство 0 нужна. Она остаётся. Всё работает, как и задумывалось (и даже не падает в защищённом режиме на радость быдлокодерам).

  2. Во втором варианте оптимизатор сначала проверяет проверки программиста на избыточность, а затем выпиливает ненужные переменные:
    void contains_null_check_after_RNCE(int *P) {
      int dead = *P;
      if (false)  // P was dereferenced by this point, so it can't be null 
        return;
      *P = 4;
    }
    

    Здесь оптимизатор почему-то решил, что раз *P разыменовывается без проверки, то он априори 0 быть не может и проверять его необходимости нет. А то, что программист мог ошибиться, разработчикам оптимизатора даже в голову не приходит. Как и то, что помимо защищённого режима есть ещё и реальный. А бывают ещё компиляторы для разных контроллеров и встроенных специализированных систем, где разыменовывать 0 указатели бывает нужно и иногда даже необходимо. Или clang такие системы не поддерживает? И никогда не сможет поддержать с подобным подходом, ориентированным на работу только защищённых многозадачных ОС.

    Но вернёмся к статье. На следующем этапе выпиливается переменная dead и проверка на 0 и остаётся:

    void contains_null_check_after_RNCE_and_DCE(int *P) {
      *P = 4;
    }
    

    Если раньше программа корректно работала в реальном режиме, а в защищённом падала, то теперь в реальном режиме вектор 0-ого прерывания перезаписывается адресом 4. В результате при любой ошибке деления компьютер намертво зависает (хотя реальный режим clang, как я понимаю, не поддерживает и никогда не сможет поддержать с таким шикарным легаси).

3. Третий пример я разбирать не буду, т. к. согласен с автором, что оптимизация «x > x+1 всегда false» может быть полезна при использовании макросов. А для проверки переполнения существуют константы MAX_*.

4. Четвёртый пример — почти из поста Вызов никогда не вызываемой функции. Его уже разобрали по полочкам, сломали все копья, какие только можно было сломать, в т. ч. и я, поэтому здесь повторяться не буду. Единственно, скажу, что мне было непонятно, зачем заменять вызов функции по 0-ому адресу с неизбежным сегфолтом на недопустимую инструкцию ud2. Автор поясняет во 2-й статье:

2. Clang has an experimental -fcatch-undefined-behavior mode that inserts runtime checks to find violations like shift amounts out of range, some simple array out of range errors, etc. This is limited because it slows down the application's runtime and it can't help you with random pointer dereferences (like Valgrind can), but it can find other important bugs. Clang also fully supports the -ftrapv flag (not to be confused with -fwrapv) which causes signed integer overflow bugs to trap at runtime (GCC also has this flag, but it is completely unreliable/buggy in my experience). Here is a quick demo of -fcatch-undefined-behavior:

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

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

И напоследок 2 эпические цитаты. Первая из начала 1-ой статьи. Она очень понравилась dzidzitop:

It turns out that C is not a «high level assembler» like many experienced C programmers (particularly folks with a low-level focus) like to think

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

А вторая из 3-ей, заключительной статьи:

Ultimately, undefined behavior is valuable to the optimizer because it is saying «this operation is invalid - you can assume it never happens».

В вольном пересказе это обозначает: «Вау! Неопределённое поведение! Ворочу куда хочу!»

UPD: Вот хочу добавить сюда ещё несколько ответов на вопросы, на которые приходится отвечать по всему треду одно и то же:

1. То, что ub обозначает «делай, что хочешь!», мягко говоря, неправда. Вот, что написано в стандарте C99:

3.4.3

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

2 NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).

3 EXAMPLE An example of undefined behavior is the behavior on integer overflow.

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

1. Игнорировать ситуацию. Смотрим в Ожегове, что обозначает слово «игнорировать»:

Умышленно не заметить, не принять во внимание.

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

2. Компилировать и выполнять такой код в соответствии с документацией, с выводом предупреждающих сообщений или без них. Т. е. напишите явно в документации, что если мы встречаем 0 указатель, то делаем то-то и то-то, и делайте. Но не в тихую.

3. Прерывать компиляцию и/или выполнение с обязательным выводом диагностических сообщений.

И всё. Ни о каком «что хочешь» в стандарте речи не идёт. Вот тут мне в каментах подсказали, что «with unpredictable results» обозначает «что хочешь». Но на самом деле это обозначает лишь то, что результаты могут быть непредсказуемыми, а совсем не то, что компилятор может делать всё, что угодно (хотя разработчикам таких компиляторов подобная трактовка очень удобна).

Ну и тот же человек считает, что «это notes», а значит неважно, что там написано. Но т. н. неопределённое поведение при переполнении целого — вообще example из того же пункта:

EXAMPLE An example of undefined behavior is the behavior on integer overflow.

И больше я нигде никаких упоминаний об ub при арифметическом переполнении не нашёл. Про переполнение при сдвигах — нашёл. А в других случаях — нет. Но все почему-то на этот example ссылаются.

2. Многие говорят, что быдлокодеры должны страдать. Но серьёзные уязвимости, связанные с ub, а точнее с непредсказуемой реакцией компилятора на ub, в разное время обнаруживались в ядре Linux, во FreeBSD и в GDK-Pixbuf, затрагивающая Chromium, Firefox и VLC. Подробнее см. в этом комментарии, чтоб не раздувать и без того длинный верхний пост. Здесь только скажу, что уязвимость в ядре Linux связана с ошибкой, идентичной со 2-м примером из разбираемых статей.

3. Автор статей и многие в этом треде утверждают, что автоматически отыскать такие ошибки очень сложно и дорого, а то и вовсе невозможно. Но это тоже не так. В Интернете я нашёл такой пример си++ программы с ub:

#include <iostream>
int main()
{
    for (int i = 0; i < 300; i++)
        std::cout << i << " " << i * 12345678 << std::endl;
}

Программа из-за переполнения временного результата на 174-й итерации при использовании ключа оптимизации -O2 в g++ попадает в бесконечный цикл.

Запустив компиляцию, я получил следующие предупреждения (причём безо всяких опций -W что-то_там):

$ g++ -o infinity_loop -O2 infinity_loop.cpp
infinity_loop.cpp: В функции «int main()»:
infinity_loop.cpp:5:38: предупреждение: iteration 174u invokes undefined behavior [-Waggressive-loop-optimizations]
         std::cout << i << " " << i * 12345678 << std::endl;
                                      ^
infinity_loop.cpp:4:5: замечание: containing loop
     for (int i = 0; i < 300; i++)
     ^

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

4. Наконец, на Хабре я вычитал, что стандартный макрос

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

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

UPD 2: Вот тут Sorcerer в комментарии кинул ссылку на письмо Линуса Торвальдса в рассылке от 12 января 2009 года, где он пишет о том, что думает о некоторых оптимизациях. Приведу несколько фрагментов этого письма в своём переводе:

Type-based aliasing — это тупость. Это такая невероятная тупость, что даже не смешно. Оно испорчено. И gcc взял испорченную концепцию и настолько её раздул, следуя букве-закона, что получилась бессмысленная вещь.

[skip]

Это НЕНОРМАЛЬНО. Это так невероятно безумно, что люди, которые делают это, просто должны избавиться от своего убожества, прежде чем они смогут восстановить. Но реальные gcc программисты действительно думали, что это имеет смысл, потому что стандарт это позволяет и даёт компилятору максимальную свободу, — потому что он может делать теперь вещи БЕЗУСЛОВНО АБСУРДНЫЕ.

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

[skip] И если кто-то жалуется, что компилятор невменяемый, компиляторщики скажут «ня, ня, разработчики стандарта сказали, что так можно», с абсолютным отсутствием анализа, имеет ли оно СМЫСЛ.

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

[skip]

Угадайте, что произойдёт, если вы имеете такой безумный склад ума и пытаетесь сделать безопасный код без alias'а, — вы займёте лишнее пространство на стеке.

По факту, Linux использует -fno-strict-aliasing из-за чертовски веской причины: потому что в gcc понятие «strict aliasing» является огромной зловонной кучей д-рьма. Linux использует этот флаг не потому, что Linux исполняется быстро и свободно, он использует этот флаг, потому что _не_ использует тот безумный флаг.

Type-based aliasing неприемлемо тупо для начала, и gcc вознёс этот идиотизм до совершенно новых высот, фактически не обращая внимания даже на статически видимый aliasing.

Линус

Оригинал (на английском):

( читать дальше... )

И ещё спасибо anonymous'у за камент с ещё одним сообщением на ту же тему того же автора от 26 февраля 2003 года.

Ну и от себя добавлю, что не только Линусу не нравится aliasing. Microsoft тоже не спешит реализовывать его в своём Visual C++. Т. е. не нравится это тем, кто помимо разработки компиляторов создаёт и другой софт с использованием этого компилятора, например ОС. А те, кто создают только компиляторы для сферических программистов в вакууме, рьяно эту фичу реализуют, хоть их и никто не заставляет.

Ну и напоследок оставлю несколько полезных ссылок на память:

Стандарт C11 (последний) (pdf), Стандарт C99 (pdf),

http: //read.pudn.com/downloads133/doc/565041/ANSI_ISO%2B9899-1990%2B%5B1%5D.pdf (Стандарт C89) (pdf),

http: //web.archive.org/web/20030222051144/http: //home.earthlink.net/~bobbitts/c89.txt (Стандарт C89) (txt),

https: //web.archive.org/web/20170325025026/http: // www .open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4660.pdf (Стандарт C++17) (последний) (pdf),

Стандарт C++14 (pdf), Стандарт C++11 (pdf),

бумажный перевод стандарта C++17, выполненный Зуевым и Чуприновым, Москва, 2016, на основе Working Draft, Standard for Programming Language C++ от 22 мая 2015 года (номер документа n4527) за 4945 руб. (надеюсь, что эту ссылку не сочтут за рекламу, т. к. к авторам я никакого отношения не имею), а здесь можно скачать начало перевода (предисловие и содержание), ну и ещё торрент-ссылку видел на эту книгу, но здесь её публиковать не буду,

статья на Хабре (из песочницы) от 2014 г. Неопределенное поведение в C++, ещё одна статья там же от 2016 года Находим ошибки в коде компилятора GCC с помощью анализатора PVS-Studio, Разыменовывание нулевого указателя приводит к неопределённому поведению и Про C++ алиасинг, ловкие оптимизации и подлые баги. Это так, ссылки на заметку.

Некоторые ссылки парсер ЛОР'а не принял, поэтому мне пришлось разделить их пробелами, превратив в текст, который можно скопировать в адресную строку браузера, удалив пробелы. Там, где http встречается дважды в 1 строке — не ошибка, а именно такие ссылки.

 , , , ,

aureliano15 ()

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

Привет, форумчане!

Тема конкурса навеяна этим тредом и программкой http://www.ioccc.org/1984/anonymous/anonymous.c , на которую я пару-тройку месяцев назад наткнулся в каментах к этой теме.

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

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

Призов нет. Только моральные поощрения самых фееричных дураков в каментах типа «афтар, пеши исчо!»

Я, в качестве конферансье и одновременно участника, открываю конкурс своей программой на Си your_name.c, содержащей краткий комментарий, 1 инклуд (для подавления предупреждений, а так можно было бы обойтись и без него), нескольких десятков дефайнов и далее собственно программы, состоящей исключительно из знаков подчёркивания («_»), разделённых пробелами или ньюлайнами.

/**
 * The program your_name output your name.
 *
 * Module:  your_name.c
 * Compile: gcc -o your_name your_name.c
 * Call:    ./you_name
 *       or
 *          ./you_name firstname secondname thirdname ...
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2017.
 */
#include <stdio.h>

#define _ (
#define __ )
#define ___ ,
#define ____ [
#define _____ ]
#define ______ ;
#define _______ {
#define ________ }
#define _________ =
#define __________ <
#define ___________ *
#define ____________ +
#define _____________ -
#define ______________ **
#define _______________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) i##p
#define ________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) i##p##c
#define _________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) p##k##g##b
#define __________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) e##b##m##p##c
#define ___________________(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) h##j##a##q##c##l
#define _______________________________(x) #x
#define ____________________ _______________(+,-,+,/,?,=,~,-,+,/,~,^,?,+,-,+,=,?)
#define _____________________ _______________(+,-,+,/,?,^,~,-,=,/,~,^,?,+,-,=,/,?)
#define ______________________ ________________(z,v,t,b,j,i,x,0,i,w,u,o,9,t,a,n,f,e)
#define _______________________ _________________(m,n,o,i,x,y,i,j,k,b,a,x,y,k,l,m,n,u)
#define ________________________ _________________(s,r,q,d,c,b,a,e,f,g,h,i,j,a,b,c,d,e)
#define _________________________ _______________(a,b,c,d,e,f,g,h,i,j,a,b,c,d,e,f,g,h)
#define __________________________ _________________(f,e,d,c,b,a,s,t,u,k,l,a,b,c,d,e,f,g)
#define ___________________________ ___________________(i,s,t,u,m,n,o,p,q,r,s,f,e,d,l,m,n,o)
#define ____________________________ __________________(h,g,s,t,f,f,g,h,a,b,c,d,e,r,s,t,u,0)
#define _____________________________ ___________________(t,s,r,q,p,p,q,r,s,e,i,n,m,l,s,t,u,v)
#define ______________________________ ________________(p,q,r,s,j,i,h,g,f,e,d,k,l,m,n,o,p,q)
#define ____________________________________________________ __________________(s,t,n,m,s,t,a,b,i,j,k,c,d,e,h,i,j,m)
#define ________________________________ _______________________________(%)
#define _________________________________ _______________________________(:)
#define __________________________________ _______________________________(_)
#define ___________________________________ _______________________________(a)
#define ___________________________________________________ _______________________________(d)
#define ____________________________________ _______________________________(e)
#define _____________________________________ _______________________________(i)
#define ______________________________________ _______________________________(m)
#define _______________________________________ _______________________________(n)
#define ________________________________________ _______________________________(o)
#define _________________________________________ _______________________________(r)
#define __________________________________________ _______________________________(s)
#define ___________________________________________ _______________________________(t)
#define ____________________________________________ _______________________________(u)
#define _____________________________________________ _______________________________(y)
#define ______________________________________________ _______________________________(\n)

______________________ _______________________ _ ______________________
_______________________________________________ ___ ________________________
______________ ________________________________________________ __ _______
________________________ _________________________________________________
____ ___________ ____________________________________ _____________
___________ ________________________________ _____ ______
______________________ __________________________________________________
______ _________________________ _
_______________________________________________ _____________________
___________ _______________________________________ _____________ ___________
______________________________________ __ ___________________________ _
____________________________________ _______________________________________
___________________________________________
____________________________________ _________________________________________
__________________________________
_____________________________________________
________________________________________
____________________________________________
_________________________________________ __________________________________
_______________________________________ ___________________________________
______________________________________ ____________________________________
_________________________________ __________________________________ __ ___
____________________________ _
_________________________________________________ ___ ___________
___________________________________________________ _____________ ___________
________________________________ ___
____________________________________________________ __ ___
___________________________ _ _____________________________________________
________________________________________
____________________________________________
_________________________________________ __________________________________
_______________________________________ ___________________________________
______________________________________ ____________________________________
__________________________________ _____________________________________
__________________________________________ __________________________________
________________________________ __________________________________________
______________________________________________ ___
_________________________________________________ __ ______
__________________________ _______ ___________________________ _
_____________________________________________
________________________________________
____________________________________________
_________________________________________
__________________________________ _______________________________________
___________________________________ ______________________________________
____________________________________ __________________________________
_____________________________________
__________________________________________ __________________________________
__ ______ ______________________________ _
__________________________________________________ _________ ___________
_______________________________________ _____________ ___________
______________________________________ ______
__________________________________________________ __________
_______________________________________________ ______ ____________________
__________________________________________________ __
___________________________ _ ________________________________
__________________________________________ __________________________________
___ ___________ _ ________________________________________________
____________ __________________________________________________ __ __ ______
___________________________ _ ______________________________________________
__ ______ ________ _____________________________ ___________
______________________________________ _____________ ___________
______________________________________ ______ ________

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

UPD от 8 апреля 2018. Оставлю-ка здесь для себя на память из этого поста, чтоб не потерялось, из той же оперы:

/**
 * Программа putrnd использует суперслучайный алгоритм для генерации
 * суперслучайного пароля. Используйте её для генерации надёжных паролей!
 *
 * Compile: gcc -o putrnd putrnd.c
 * Call:    ./putrnd
 *
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2018.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(0));
  int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
  n |= 175684;
  n &= 203331;
  n += 202755;
  n /= 2;
  n--;
  n >>= 2;
  while(putchar(n) && d1>=0)
  {
      d1=(d1-d2)/d3-d4+d5+d6+d7;
      d6-=d7-d6;
      if(d4)
      {
          d5+=5;
          d6-=54;
          d7+=54;
      }
      if(d2)
          ++d4;
      ++d2;
      ++d3;
      n+=d1;
  }
  d5-=5;
  return (n&d5)-d5;
}

и второй, немного более запутанный вариант:

/**
 * Программа putrndgoto использует суперслучайный и суперхитрый алгоритм
 * с метками для генерации суперслучайного пароля. Используйте её для
 * генерации надёжных паролей!
 *
 * Compile: gcc -o putrndgoto putrndgoto.c
 * Call:    ./putrndgoto
 *
 * Author:  aureliano15
 * License: GPL v.3.
 * Copyleft (Ɔ) 2018.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(0));
  int n = rand(), d1=87, d2=0, d3=3, d4=0, d5=0, d6=0, d7=0;
  goto l13;
  l01: d6-=54; goto l04;
  l02: ++d3; goto l17;
  l03: putchar(n); goto l19;
  l04: d7+=54; goto l12;
  l05: n--; goto l09;
  l06: d6-=d7-d6; goto l10;
  l07: n &= 203331; goto l15;
  l08: ++d2; goto l02;
  l09: n >>= 2; goto l03;
  l10: if(d4) goto l16; goto l12;
  l11: ++d4; goto l08;
  l12: if(d2) goto l11; goto l08;
  l13: n |= 175684; goto l07;
  l14: d1=(d1-d2)/d3-d4+d5+d6+d7; goto l06;
  l15: n += 202755; goto l21;
  l16: d5+=5; goto l01;
  l17: n+=d1; goto l03;
  l18: d5-=5; goto l20;
  l19: if(d1<0) goto l18; goto l14;
  l20: return (n&d5)-d5;
  l21: n /= 2; goto l05;
}

 , , ,

aureliano15 ()

Что случилось с sane/xsane?

Вот понадобилось кое-что отсканировать в кои то веки на стареньком сканере hp scanjet 4400c. Но программы xsane, xscanimage, skanlite хоть и определяют сканер и даже запускают его, но ничего не сканируют (при сканировании получается какая-то разноцветная хрень.) Есть утилита simple-scan, которая нормально сканирует, но там нельзя настроить ни цветность, ни разрешение при сканировании, нет предварительного сканирования и сохраняет только в jpeg, png и pdf. На крайняк, конечно, и это подойдёт за неимением лучшего, но раньше xsane нормально сканировала в debian 8 этим сканером. А теперь и в debian 8.8 amd64 пробовал, и в Fedora 23 amd64 - везде не работает. Они что, выкинули поддержку scanjet 4400c, или просто испортили программу, или оно как-то лечится?

UPD: Кстати, заметил, что simple-scan при попытке сканировать с разрешением 75dpi и 150dpi тоже ничего фактически не сканирует. Тогда попробовал отсканировать в xsane без предварительного сканирования, а сразу 300dpi, и всё отсканировалось. Т. е. xsane тоже работает, но не хочет сканировать с низким разрешением (раньше с низким разрешением сканировалось нормально). Т. е. проблема именно в этом. А кто в этом виноват: sane или мой сканер, в котором что-то сгорело с момента последнего сканирования с низким разрешением - шут знает.

 , , , ,

aureliano15 ()

Законопроект об анонимайзерах

Вот тут сегодня случайно на 2 интересные новости наткнулся:

Госдума приняла в первом чтении законопроект об анонимайзерах и Глава Роскомнадзора выступил против блокировки Tor и VPN-сервисов .

Цитата из первой новости:

Проект был внесен в начале июня депутатами трёх парламентских фракций — Максимом Кудрявцевым («Единая Россия»), Николаем Рыжаком («Справедливая Россия») и Александром Ющенко (КПРФ).

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

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

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

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

Ну и из хорошего (оттуда же):

Кроме того, законопроект предполагает отмену реестра блогеров. С 1 августа 2014 года в России вступил в силу закон, по которому сайты с посещаемостью более 3 тысяч пользователей в сутки должны быть включены в соответствующий реестр, который ведет Роскомнадзор.

«Обнадёживающая» цитата из 2-ой новости:

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

Александр Жаров

Глава Роскомнадзора

Он также добавил, что ни в коем случае не призывает к тому, чтобы Tor или VPN-сервисы были заблокированы на территории России. «Но то, что они должны регулироваться — это очевидно. Потому что это серая и невидимая зона», — резюмировал глава надзорного органа.

Ну понятно, что Opera закроет торрент-сайты и др. по своей кнопке турбо. Гугл тоже перестанет выдавать ссылки на торренты и кэш с этих сайтов. Но с тором, понятно, они не договорятся, т. к. цели этого проекта прямо противоположные. И что будет? Как технически будут выявлять и наказывать десятки тысяч пользователей тора?

И что с vpn-сервисами будут делать, тоже неясно. Как контролировать их будут? А если я с одного vpn-сервиса перекину vpn на другой vpn-сервис, и с точки зрения 2-ого сервиса буду уже не из России, а из Штатов или из Нигерии?

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

UPD: Всё-таки хотелось бы услышать побольше технических оценок. Например, я знаю, что в Белоруссии давно начали борьбу с тором, но не очень успешную. Белорусы получают ссылки на не публичные мосты и заходят через них. Также слышал, что в Китае, где опыт борьбы куда больше, борются успешнее. Но китайские пользователи тоже как-то обходят эти блокировки. А вот в чём заключается это китайское ноу-хау (как в плане блокировок, так и их обходов) - не знаю. А хотелось бы узнать. Вопрос-то вполне практический. А от того, что мы здесь все единодушно осудим, ничего не изменится.

UPD 2: Решил добавить сюда некоторые практические советы по обходу блокировок tor'а из треда, чтоб не надо было их долго искать среди множества сообщений.

  1. Первый совет для меня очевиден, но кто-то, возможно, о нём не знает: использовать альтернативные мосты. Для этого надо перейти по ссылке https://bridges.torproject.org/ и следовать инструкциям. На запрос высылается 3 адреса мостов. Мосты можно получить из веб-формы с вводом капчи либо, если https://bridges.torproject.org/ заблокирован, по почте, написав на адрес bridges@torproject.org, но почтовый аккаунт должен быть на 1 из 3 хостингов: Riseup, Gmail или Yahoo.
  2. За второй совет спасибо alexferman, который написал:

    В Казахстане Тор работает только через obfs4.

    Про obfs4 можно прочитать, например, по ссылке http://webofdark.com/2017/02/20/pluggable-transports-for-tor/ . Только в статье не совсем точно написано:

    нажмите кнопку «Настройка». После этого нажмите кнопку «Далее» и выберите «obfs4» в качестве подключаемого транспорта.

    На самом деле перед тем, как нажимать «Далее», надо выбрать радио-кнопку «Да» под сообщением «Ваш провайдер (ISP) блокирует или как-либо цензурирует подключения к сети Tor?» (для русской версии tor'а). Тогда после нажатия кнопки «Далее» можно будет выбрать тип транспорта (по умолчанию как раз obsf4) либо ввести вручную адреса альтернативных мостов, полученных по инструкции из п. 1.

 , ,

aureliano15 ()

Что делать, если все бинарники вдруг исчезнут?

Навеяно этой темой.

Предлагаю гипотетическую ситуацию: какой-то мега-вирус удалил все бинарники со всех дисков, флэшек, прошивок, биосов и т. д. на всех компах, телефонах, смартфонах, планшетах и т. д. При этом исходники остались. Также само железо не пострадало. Как в такой ситуации реанимировать софт?

 , , ,

aureliano15 ()

RSS подписка на новые темы