LINUX.ORG.RU

Избранные сообщения BruteForce

Разработчики Linux и Windows работают над закрытием аппаратной уязвимости процессоров Intel

Новости — Hardware and Drivers
Группа Hardware and Drivers

Ошибка проектирования всех процессоров Intel, выпущенных за последние 10 лет, заставила разработчиков Linux и Windows в срочном порядке перерабатывать схему разделения адресных пространств ядра и пользователя, брешь в которой вызвана этой ошибкой. По известным сейчас данным, переработка требует модификации критических частей ядра и приводит к падению производительности приложений от 5 до 30% (чипы Intel 2010 года и новее имеют в своём арсенале возможности, чтобы сократить это падение).

Суть уязвимости, скорее всего, заключается в том, что спекулятивное исполнение кода косвенно нарушает контроль доступа, и это позволяет приложению «видеть» содержимое защищенного адресного пространства ядра (раннее описание). Детали уязвимости находятся под эмбарго до выпуска исправлений, который намечается на середину января 2018, когда выйдет новое ядро Linux и ежемесячное обновление безопасности для Windows.

Для решения проблемы разработчикам ядер пришлось полностью разделить память ядра и память пользовательских процессов, однако такое решение приводит к серьёзному падению производительности из-за необходимости сброса части кэша транслированных виртуальных адресов (TLB) при входе в ядро.

Разработчики ядра Линукса в шутку предлагали следующие аббревиатуры для новой модели разделения памяти ядра и пользовательских процессов: User Address Separation (*_uass) и Forcefully Unmap Complete Kernel With Interrupt Trampolines (fuckwit_*), однако остановились на Kernel Page Table Isolation (kpti_*).

Компания AMD утверждает, что её процессоры уязвимости не подвержены.

Обсуждение патча на LWN, с результатами тестов.

Общие подробности от издания The Register

>>> Технические подробности, демонстрационный код PoC

 , , ,

birdie
()

Карма и плюсики для лора

Форум — Talks

Устанавливаем юзерскрипт https://lorka.sytes.net/lorka.user.js

Можем ставить плюсики в карму, и плюсики к комментам. Пока только при открытии треда, в списке тредов/трекере и т.п. нет

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

Скрин: https://imgur.com/a/RusLD

 , , ,

pawnhearts
()

Посоветуйте аналог localbitcoins для Эфира.

Форум — Talks

Вопрос с колокольни отсутствия бюрократии в процессе покупки.

 , ,

cvv
()

BSDунутая непостижимость

Форум — General

Сразу оговорюсь я тролль правда никак не попаду в ритм.Значит по порядку:

1)Перехожу по сслыке https://mirror.yandex.ru/pub/OpenBSD/6.2/

2)Выбираю amd64 https://mirror.yandex.ru/pub/OpenBSD/6.2/amd64/

3)Далее мне нужно записать на Usb образ,выбираю - install62.iso

4)Reboot и с установочной флешки пускаю установщик BSD

5)PROFIT!

Так вот,хотелось бы узнать после установки у меня будет возможность ставить софт через pkg_add или нужно еще как-то подключать репы или зеркала?Вобщем какие есть подводные камни при установке и что нужно доставить после? Кастую buratino cetjs2

 

Root14
()

Поясните за TensorFlow

Форум — Development

Я сейчас смотрю вот этот видосик. Там обучается сеть для определения тональности текста.

Вопрос - можно ли «экспортировать» обученную сеть? В идеале, мне бы ее использовать вообще в другом ЯП, возможно ли это?

 ,

Deleted
()

Защита от вскрытия корпуса

Форум — Linux-hardware

Существуют ли какие-нибудь готовые решения для 1-юнитовых корпусов (в идеале) для защиты от физического доступа к серверу, из разряда контроля вскрытия корпуса, изменения температуры / питания, положения в пространстве, датчики давления, etc. Чтобы можно было настроить выключение сервера в случае обнаружения попыток что-нибудь с ним сделать?

Быстро гуглил - ничего адекватного не нашел, кроме огромного серверного шкафа для этого, либо какие-то детские варианты с замками.

 

drakmail
()

Яндекс банит почтовые ящики по ключевым словам

Форум — Talks

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

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

1) Первый раз мой аккаунт на яндексе забанили в январе 2017 года. Что делал: зашел на один из основных акков, которым пользовался для интернет-покупок с 2008 года, написал в сапорт VPN-провайдера, т.к. собирался менять свой VPN на новый, задал несколько вопросов по поводу надежности и абузоустойчивости их VPN. Вечером при попытке войти в ящик, яндекс написал, что доступ заблокирован по подозрению во взломе. Хотя я всего-лишь отправил письмо. Для восстановления доступа потребовали номер телефона, чего я естественно давать не собирался, ибо нефиг.

2) Через несколько дней я повторил это с другим яндекс ящиком. Я взял другой свой компьютер, зашел на другой яндекс-ящик (тот был для соцсетей), и повторил тот же самый эксперимент, только уже с другим VPN-провайдером, т.е. написал письмо с примерно такими же вопросами о приватности и абузоустойчивости. Вечером и этот акк забанили «по подозрению во взломе». Тут я уже призадумался, 2 акка потеряно, тут есть связь.

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

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

4) Летом, когда начали раскручивать хайп про Матильду, я сидел на работе. И пока жрал свой бургер, с рабочей почты (она тоже была на яндексе) написал письмо в ближайший кинотеатр, с вопросом когда начнется предзаказ на Матильду. Почта, которой я ежедневно пользовался 3 года, была забанена в течении 2х часов, опять «по подозрению на взлом». Восстанавливать не стал, т.к. это была не корпоративная рабочая почта, а просто почта, которой я пользовался только на работе.

5) Далее сентябрь. Взял совсем новый комп, с совсем новой чистой осью, и даже с новым интернетом, который был резервный домашний интернет. Зарегал новый акк на яндексе, и написал письмо в другой кинотеатр, с вопросом будут ли показывать Матильду? К вечеру акк забанили. Опять «подозрительная активность». Пишу в их говеный сапорт, говорю идите нафиг, все нормально с моей активностью, верните доступ. В ответ хрен вам сударь, будьте добры ввести номер телефона и достоверные паспортные данные! О как.

6) В октябре написал письмо в Роскомсвободу (может знаете, такая организация, которая мониторит блокировки в инете и много чего еще) через новый яндекс-ящик. Предложил написать новость по этим случаям, провести расследование, разобраться что это за херня. Забанили в этот же день мой ящик.

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

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

Перемещено leave из general

 , , , ,

zorro34
()

Принимаю пари

Форум — Talks

Товарищи dk- и Oberstserj заключили пари на тему будущего поставок газа из России. Через 10 (десять) лет. За базу взяты текущие показатели.

Позиция dk-:

вангую рост минимум в 1,5. И точно не падение.

500 000 ₽ (комментарий)

Позиция Oberstserj:

считать будем именно объем газа поставленного с территории РФ за кардон. Я ж собственно поэтому поводу спор затевал. Вангую падение не мене, чем в 2 раза.

500 000 ₽ (комментарий)

На кону:
Коньяк 50 лет. Франция. Бутылка. Из приличного магазина. До 0,5-1к евро.

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

- - -

Товарищи dk- и greenman заключили пари на тему курса USD/RUR по итогу 2018 года.

Позиция dk-:

на 01.01.2019 рубль, если и ослабнет, то не более чем на 10% относительно показателя 01.12.2017.

Не только китайские коррупционеры (комментарий)

Позиция greenman:

[ослабнет ] более, чем на 10% к курсу на 01 декабря 2017. Курс рубля РФ к доллару США.

Не только китайские коррупционеры (комментарий)

На кону:
Бутылка стоимостью до 2 000 рублей (в ценах на сегодня), по выбору победителя.

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

 

dk-
()

Быстрый ассоциативный массив для чтения

Форум — Development

Задача сделать констаный асоциативный массив строка -> число для С++. Т.е. после создания он изменяться не будет.

Далее

using обьект = "констаный асоциативный массив строка -> число";

Условия:

  • Обьект создается только один раз
  • Можно чтоб обьект был инициализирован до вызова main
  • Ключи (строки) и значения (числа) известны уже на этапе компиляции и не изменяются с этого момента.
  • Ключи как и значения уникальны (т.е. значения не повторяются, а одному ключу соответствует только одно значение)
  • На 90% ключей состоят ровно из 3 символов: большие буквы A-Z и/или цифры 0-9. Остальные 10% ключей не превышают в длинне 15 символов (однако могут иметь также и маленькие буквы a-z).
  • Ключи можно вычислять из строки, главное чтоб выполнялось:
    f(x) != f(y) для (x != y), (x, y) на всем множестве ключей
    f(x) == f(x) для x на всем множестве ключей
    
  • Приоритетом является быстрый доступ к значению по точному ключу
  • Требуется механизм проверки присутствует ли ключ (т.е. входные данные не всегда валидны)
  • Необходима возможность добавления новых пар ключ-значение в последующих компиляциях (ну, чтоб по крайней мере это не было адски сложно)
  • Стандарт C++14 (и можно использовать фичи из C++17)

Желательно (но не обязательно):

  • Сборка обьекта в compile-time (напр. constexpr)
  • Возможность итерации по всем ключам обьекта
  • Чтоб значения не были слишком сильно разбросаны

Чем можно пренебречь:

  • Размером конечного обьекта (может быть ну очень большим)
  • Временем компиляции (т.е. может быть адская шаблоно-лапша, главное чтоб соответствовало условиям выше)

Сейчас, чтоб сильно не заморачиватся, используется

using namespace std::string_view_literals;

const std::unordered_map<std::string_view, int> map{
    { "key"sv, 42 },
    // ...
};

Однако появилось время покопаться, по этому прошу подсказать, как можно улучшить?

Т.е. было бы прикольно даже иметь хеш-функцию f(str) -> int которая бы гарантировала отсутствие коллизий и не слишком разбросанные значения.

 ,

KennyMinigun
()

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

Форум — Development

про 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
()

NASA воссоздало потерянную запись высадки человека на Луну

Форум — Talks

http://top.rbc.ru/society/17/07/2009/316098.shtml?print я просто оставлю это здесь.

as33
()

AwesomeFont fa-music и xof4 Terminus

Форум — General

Начал таки мучать свой i3 и менять шрифт. Terminus мне таки очень нравится, а иконки удобно брать из AwesomeFont. Вот только отдельно fa-music не показывается по сути: http://imgur.com/a/dFjAk сверху показывается как какие-то 2 цифровые восьмерки. Случайная выборка 15 других иконок работает в терминусе. На других шрифтах (DejaVu, Awesome очевидный) иконка отображается корректно. Это можно как-то починить?

 , ,

JAkutenshi
()

Android, зонды, безопасность, СПО, паранойя

Форум — Mobile

Disclaimer1: Проблема с данным маном в том, что местной аудитории, например, плевать на ведроид, а тому же 4pda наплевать на фанатичный СПО и избавление от зондов. Рискнем и запостим здесь.

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

Уровень прошивки

Практически все стоковые прошивки на сегодняшний день идут с gapps (Google Apps). Что же это за зверь:

  • Любое приложение (даже не требуещее никаких прав) может с ним общаться.
  • Gapps имеют доступ к сети.
  • Gapps позволяют Google в любой момент установить/удалить с вашего телефона любое приложение.
  • Gapps постоянно держат открытое сетевое соединение с серверами гугла (для нужд push-нотификаций).
  • Gapps — нереальное огромное количество кода. Стоковый образ (если верить opengapps) будет весить около 700Мб.

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

Сложный вопрос, на самом деле. Есть три варианта действий:

  • Новый и простой, и профитный способ. Появилась прошивка «LingeageOS for microG». Если ваше устройство поддерживает её, просто ставьте её и наслаждайтесь. Fdroid+MicroG+пуши+signature spoofing+unlp+OTA-обновления из коробки
  • Самый простой способ. Если ваш андроид достаточно старый (на достаточно новом не удастся отключить самый главный компонент gapps), из Настройки->Приложения отключите все, связанное с Google (особенно, Google Service Frameworks):
    • root не требуется;
    • push-уведомления работать не будут;
    • на устройстве останется огромная и потенциальная куча гугловского дерьма, хоть и менее активная.
  • Способ посложнее. Накатываем root и вручную удаляем все пакеты и библиотеки, требуемые гуглу:
    • требуется root и разблокировка загрузчика;
    • минимальное количество зондов без смены прошивку на полностью опенсорсную;
    • увы, в последних версиях андроида вам, скорее всего, придется оставить несколько пакетов (вроде GoogleSetupWizard), иначе система не загрузится.
  • Самый профитный способ. Ставим альтернативную прошивку (или мотаем до следующей секции и покупаем устройство с пгавославной прошивкой без зондов из коробки). Наслаждаемся.
    • Требуется root, разблокировка загрузчика, шаманство и местами смена устройства.

Я тут начал наслаждаться, но вдруг понадобились пуши, да и Uber требует зонды. Что делать?

Вдоль

Попробовать поставить MicroG, свободную реализацию клиентской части гуглозондов. Самая больная часть: помимо собственно MicroG вам нужно будет запилить себе Signature Spoofing. Коротко говоря, это обход защитного механизма, не позволяющего прикидываться gapps'ами кому попало. Для этого необходимо либо патчить прошивку при помощи Xposed/Needle/Haystack, либо использовать совместимую прошивку (смотрите список, по ссылке, их стало очень много). Все подробности по той ссылке.

MicroG позволяет завести пуши, сервисы геолокации (со множеством бекендов, ищите nlp location backend в f-droid) и большое количество софта (когда я в последний раз тыкал, работали даже покемоны).

Уровень софта

Без гуглозондов жить есть!

https://f-droid.org/ — каталог с опенсорсным софтом.

Предлагаю вам следующий список приложений, способный заменить типичный набор проприетари из типичной вендорской прошивки. Аналогичный список: https://github.com/Datenschutz/awesome-FOSS-apps

  • Yalp store. Позволяет ставить приложения из Google Play (да, иногда это все-таки нужно), в том числе через общий аккаунт. Не требует зондов.
    • Позволяет так же выкачивать купленные приложения (но не факт, что они заработают: они при работе могут проверять лиценизию через gapps, возможно, тут может помочь microg).
    • Альтернативно, воспользуйтесь моим решением для выкачивания софта прямо в свой репозиторий f-droid.
  • K-9 Mail. Почтовый клиент.
  • DAVDroid. Синхронизация контактов с owncloud/nextcloud.
  • Gadgetbridge. Синхронизация с умными часами и браслетами (pebble, mi band и некоторые другие)
  • NewPipe. Клиент для YouTube. Умеет воспроизводить видео в фоновом режиме как музыку, загружать файлы.
  • Odyssey. Просто материальный музыкальный плеер, но в последнее время очень нужный, т.к. вендоры повадились заменять в прошивке плеер на Google Music.
  • Набор простых и красивых затычек для различных приложений — simple mobile tools.
  • Файрволл AFWall+ файрволл (имеет Xposed модуль для расширения возможностей)
  • Amplify Battery Extender.
  • DNS66.
  • KDE Connect.
  • OpenKeychain.
  • OpenVPN FOSS.
  • Картография и навигация: Maps.Me (приз симпатий от комментаторов), OsmAnd (приз глюкалова от меня, но щито поделать).
  • Список стал очень жирным. Пока новые элементы не добавляю, думаю над критериями включения в него софта.

Если вы будете ставить проприетарный софт, помните о следующем:

  • Желательно зайти в настройки приложения и вручную запретить доступ ко всем ненужным разрешениям, дабы не промахнуться в нужный момент.
  • Отключите приложению фоновый доступ к сети (если у вас свежий Android) или вообще доступ к сети (если у вас стоит файрволл).
  • Малвари вроде «Сбербанк Онлайн» вообще лучше создать отдельный аккаунт на телефоне.
  • Яндексовским приложениям нельзя давать доступ к местоположению. Вообще никаким — все сливают.
  • Проприетарь может читать названия аккаунтов, даже не принадлежащих ей. Называйте их максимально обще, т.е. вместо «sportloto@syncserver.com» делайте «contacts sync».

Права суперпользователя

Читая васянский 4pda вы часто можете увидеть «ну и накатываем SuperSU.zip». Не делайте этого. Есть прекрасный опенсорсный superuser, совместимый со свежими ведроидами. Нужно лишь поставить zip (используйте beta на android >=6) и apk.

Если ваша прошивка основана на LineageOS, то все еще проще. Где-то рядом с загрузками в директории extra должен валяться zip, включающий встроенные и интегрированные в прошивку права суперпользователя. Профит.

XPosed

XPosed — опенсорсный фреймворк для низкоуровневых хаков.

  • Не доступен для свежих андроидов.
  • Позволяет заставить не увидеть root всякие «Сбербанки Онлайн».
  • Имеет кучу некрофильских и неопенсорсных модулей. Осторожнее.
  • Легким движением руки может окирпичить прошивку.
  • Полезные модули:
    • PlayPermissionsExposed
    • YouTubeAdAway (но все-таки советую использовать NewPipe, LightTube, WebTube, SkyTube или MiniTube. Тысячи их!)
    • XPrivacy — по своей сути это «песочница» для любого, даже системного, ПО. Xprivacy применяет правила ко всему ПО. Эти правила можно создавать самому или качать готовые. То есть, к примеру, если установлено нечто местами полезное, но попутно показывающее свою рекламу, Xprivacy можно просто запретить этому ПО доступ в сеть. Или если очередная косынка хочет интернет, список контактов, доступ к микрофону и камере, то с Xprivacy это легко и просто запрещается конкретно этой гадости и она даже будет при этом работать не имея доступа к тому, что ей будет запрещено.

Уровень устройства

Тут тоже всё плохо. Выбор:

  • Рандомный флагман с хорошей поддержкой LineageOS (CyanogenMod). Поддержка, вероятно, будет хорошей, секьюрити-апдейты будут приходить долго (например, для htc desire hd цианоген обновлялся до самого конца — декабря 2016 года), но вот версия андроида, скорее всего, застрянет. Обычно дорого. Можно искать по списку официально поддерживаемых линейкой устройств.
  • OneplusOne / Wileyfox Swift 1. Поставлялись с CyanogenOS, имеют хорошее коммьюнити разработчиков, будут долго обновляться в софтовой части. В железной — все плохо. 1+1 уже довольно старый и хорошие запчасти купить сложно. Wileyfox изначально имел несколько проблем, в т.ч. слабенькую батарейку. Компенсируется ценой, местами можно найти новое в продаже. Довольно бюджетно.
  • Fairphone 2. Очень дорого, очень хорошо. Но это в теории, как там на практике — хз, не пользовался, отпишитесь.
  • Рандомный телефон с официальным портом los. Сойдет, главное, чтобы фатальных багов в порте не было. Долгой жизни порта не ждите.
  • Рандомный телефон с васянским los. Совсем плохо, но если телефон уже куплен, ничего не поделать.
  • Рандомный телефон с васянским ведроидом, основанным на стоковой прошивке / без исходников / проч. Лучше такое не ставить, а подготовить прошивку самостоятельно, смотрите выше и ниже.

Следует также заметить, что:

  • Существует несколько устройств с CyanogenOS, без доступной Cyanogenmod. В комплекте идут сервисы microsoft, gapps и много разной другой блотвари. Исходники обычно зажабены. Пример устройств: Wileyfox Spark, Wileyfox Swift 2(|+|x).
  • Выбирая устройство, так же загляните на его страничку на 4pda. Ресурс хоть и васянский, но очень полезный: можно увидеть список доступных прошивок, FAQ по типичным проблемом, список самых вероятных заводских проблем (которые можно проверить еще перед покупкой).

Уровень физической безопасности

Для чего нужна физическая безопасность:

Допустим, ваш девайс попал в руки злоумышленнику.

  • Во-первых, вы хотите, чтобы он не имел никакой возможности прочитать важные файлы с вашего телефона (кейз ФБ-1).
  • Во-вторых, вы хотите узнать, не добавил ли он кейлоггеров в ваш загрузчик (кейз ФБ-2).

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

Я бы на вашем месте на это не рассчитывал.

  • Аппаратные защиты часто не надежны и опираются на принципах безопасности через неясность, в них переодически находят уязвимости
  • На прекрасных, казалось бы, телефонах Xiaomi вы не сможете разблокировать загрузчик, если с Xiaomi что-либо случится: разблокировка производится с участием интернета при помощи (работающей только под Windows) программы, требующей их аккаунта и доступа к интернету. У HTC похожая ситуация, но в несколько более мягких условиях.
    • Скорее всего, это доставит неудобств именно вам, а не злоумышленнику
  • Всякие проприетарные системы полнодискового шифрования тоже не выдерживают проверок специалистами.

Выводы:

  • Для хранения ваших секретных файлов в безопасности от ФБ-1 используйте, к примеру, Secrecy.
  • «Таблеток» от ФБ-2 на сегодняшний день нет. Промбируйте телефон при помощи скотча и волос и не расставайтесь с ним.
  • Лучше все-таки не хранить никакие важные данные на телефоне.

Модули сотовой связи

В каждом мобильном телефоне, почти каждом планшете есть GSM-модуль мобильной связи. Это —

  • Фактически отдельное устройство, обычно имеющее максимальный доступ к процессору, памяти и переферии. Зачем это делают — черт знает. Возможны исключения, нужно уточнять в каждом отдельном случае.
  • Идентифиционный модуль, который постоянно разговаривает с воздухом.
  • Куча проприетарного кода, который никто не анализировал. В тех немногих случаях, когда анализировали — находили кучу всего интересного.
  • Работает это все на протоколах, местами разработанные в 80-х годах.

Так что тут все настолько плохо, что я даже предложить ничего не могу. Страдайте.

Вроде, все, что хотел сказать. Выдыхаю

 , , , ,

derlafff
()

Задачи по программированию

Форум — Development

Привет!

Порекомендуйте, пожалуйста, сборники задач по программированию толковые в том смысле, что задачи были бы отобраны и более или менее отранжированы по уровню (такое, в частности, встречается в книжках). Известные книжки: Кормен и Cracking the coding interview. Что можно посмотреть ещё? Сайты также интересуют, хотя качество содержимого как правило страдает (одинаковые задачи, заносы по уровню). Где можно посмотреть задачи, специфичные для данного языка (C\C++)?

 , , , ,

dann
()

Удалил все местоположение

Форум — Mobile

Теперь даже ни гугл карты в браузере, ни гугл карты обычные, ни какие-либо другие карты не могут определить мое местоположение. Теперь показывает что я под Красноярском, хотя я не там.
Что я делал: удалил все гугловские приложения - hangouts, google play, google gmail, google services и т.д. ...

Вот скриншот экрана http://rgho.st/6qYnkCccZ
Удалил все отслеживание с помощью скрипта

rm -rf /system/app/CarHomeGoogle.apk
rm -rf /system/app/ChromeBookmarksSyncAdapter.apk
rm -rf /system/app/ConfigUpdater.apk
rm -rf /system/app/FaceLock.apk
rm -rf /system/app/GenieWidget.apk
rm -rf /system/app/Gmail.apk
rm -rf /system/app/GmsCore.apk
rm -rf /system/app/GoogleBackupTransport.apk
rm -rf /system/app/GoogleCalendar.apk
rm -rf /system/app/GoogleCalendarSyncAdapter.apk
rm -rf /system/app/GoogleContactsSyncAdapter.apk
rm -rf /system/app/GoogleFeedback.apk
rm -rf /system/app/GoogleLoginService.apk
rm -rf /system/app/GoogleNow.apk
rm -rf /system/app/GoogleNowVoiceSearch.apk
rm -rf /system/app/GooglePartnerSetup.apk
rm -rf /system/app/GoogleQuickSearchBox.apk
rm -rf /system/app/GoogleServicesFramework.apk
rm -rf /system/app/GoogleTTS.apk
rm -rf /system/app/LatinImeTutorial.apk
rm -rf /system/app/LatinImeDictionaryPack.apk
rm -rf /system/app/MarketUpdater.apk
rm -rf /system/app/MediaUploader.apk
rm -rf /system/app/NetworkLocation.apk
rm -rf /system/app/OneTimeInitializer.apk
rm -rf /system/app/Phonesky.apk
rm -rf /system/app/PlayStore.apk
rm -rf /system/app/SetupWizard.apk
rm -rf /system/app/Talk.apk
rm -rf /system/app/Talkback.apk
rm -rf /system/app/Vending.apk
rm -rf /system/app/VoiceSearch.apk
rm -rf /system/app/VoiceSearchStub.apk
rm -rf /system/etc/permissions/com.google.android.maps.xml
rm -rf /system/etc/permissions/com.google.android.media.effects.xml
rm -rf /system/etc/permissions/com.google.widevine.software.drm.xml
rm -rf /system/etc/permissions/features.xml
rm -rf /system/etc/preferred-apps/google.xml
rm -rf /system/etc/g.prop
rm -rf /system/addon.d/70-gapps.sh
rm -rf /system/framework/com.google.android.maps.jar
rm -rf /system/framework/com.google.android.media.effects.jar
rm -rf /system/framework/com.google.widevine.software.drm.jar
rm -rf /system/lib/libfilterpack_facedetect.so
rm -rf /system/lib/libfrsdk.so
rm -rf /system/lib/libgcomm_jni.so
rm -rf /system/lib/libgoogle_recognizer_jni.so
rm -rf /system/lib/libgoogle_recognizer_jni_l.so
rm -rf /system/lib/libfacelock_jni.so
rm -rf /system/lib/libfacelock_jni.so
rm -rf /system/lib/libgtalk_jni.so
rm -rf /system/lib/libgtalk_stabilize.so
rm -rf /system/lib/libjni_latinimegoogle.so
rm -rf /system/lib/libflint_engine_jni_api.so
rm -rf /system/lib/libpatts_engine_jni_api.so
rm -rf /system/lib/libspeexwrapper.so
rm -rf /system/lib/libvideochat_stabilize.so
rm -rf /system/lib/libvoicesearch.so
rm -rf /system/lib/libvorbisencoder.so
rm -rf /system/lib/libpicowrapper.so


upd. все-таки gps test определил координаты... http://rgho.st/87kbvj445

 , , , местоположение

w1nner
()

Обновился инструмент для работы с агентами в C++: SObjectizer 5.5.0

Форум — Development

SObjectizer — это реализация модели акторов для C++, позволяющая программировать на C++ с использованием работающих на разных нитях агентов, общающихся между собой посредством сообщений. SObjectizer существенно упрощает разработку событийно-ориентированных приложений, для параллельной и независимой обработки событий в которых требуется многопоточность и/или распределенность. SObjectizer использовался для создания как для мелких утилит, так и серьезных распределенных приложений, работающих под большой нагрузкой в режиме 24x7.

Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Подробнее об истории, текущем состоянии и направлении движения SObjectizer можно прочитать здесь.

Версия 5.5.0 является результатом очередного, очень значимого этапа развития проекта.

Главное отличие v.5.5.0 от предыдущих версий — это отсутствие зависимости от ACE Framework. Т.е. теперь ACE в коде ядра SObjectizer не используется вообще, для SObjectizer достаточно наличия стандартной библиотеки C++11. Это означает, что SObjectizer уменьшился в размере, нужно меньше времени на сборку SObjectizer-проектов, упрощается поддержка различных компиляторов и платформ. В частности, эта версия SObjectizer тестировалась посредством MSVS2013 (Windows), GCC 4.8/4.9 (Windows, Linux), Clang 3.5.0 (Linux).

Из более мелких изменений можно отметить прямую поддержку std::chrono при работе с отложенными/периодическими сообщениями, а так же небольшое изменение названий некоторых классов/функций (с сохранением старых имен для обеспечения совместимости). Более подробная информация о нововведениях в v.5.5.0 доступна в соответствующем разделе Wiki проекта. Так же увеличилось количество страниц с описаниями базовых вещей SObjectizer.

Версия 5.5.0 может быть загружена из раздела Files или получена из Subversion-репозитория.

Примечание. Этот релиз содержит только ядро SObjectizer (т.е. проект so_5). Никакие другие подпроекты (вроде so_log или so_sysconf) в релиз не включены. Возможно, сборка SObjectizer Assembly со всеми подпроектами будет сформирована и опубликована позже (если она действительно кому-то потребуется).

PS. Анонс делается просто для того, чтобы уведомить, что такой проект есть, живет, развивается. Доступен под BSD-лицензий, т.е. даром, в том числе и для коммерческих проектов. Это не просьба сделать code review. И не попытка кому-то что-то «продать».

PPS. Специально для желающих постебаться над синтаксисом и посравнивать программирование на C++ с Perl-ом. Вот классический пример Hello, World. В традиционном, ООП-шном варианте, с созданием класса агента и переопределением виртуальных методов (хотя есть и более модерновый вариант, с использованием С++ных лямбда-функций):

#include <iostream>

// Main SObjectizer header files.
#include <so_5/all.hpp>

// Definition of an agent for SObjectizer.
class a_hello_t : public so_5::rt::agent_t
{
	public:
		a_hello_t( so_5::rt::environment_t & env )
			: so_5::rt::agent_t( env )
		{}

		// A reaction to start of work in SObjectizer.
		virtual void
		so_evt_start() override
		{
			std::cout << "Hello, world! This is SObjectizer v.5."
				<< std::endl;

			// Shutting down SObjectizer.
			so_environment().stop();
		}

		// A reaction to finish of work in SObjectizer.
		virtual void
		so_evt_finish() override
		{
			std::cout << "Bye! This was SObjectizer v.5."
				<< std::endl;
		}
};

int
main( int, char ** )
{
	try
	{
		// Starting SObjectizer.
		so_5::launch(
			// A function for SO Environment initialization.
			[]( so_5::rt::environment_t & env )
			{
				// Creating and registering single agent as a cooperation.
				env.register_agent_as_coop( "coop", new a_hello_t( env ) );
			} );
	}
	catch( const std::exception & ex )
	{
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}

	return 0;
}

PPPS. Специально для желающих узнать, чем SObjectizer лучше libcppa/CAF. В двух словах — это две совершенно разные разработки, ставящие перед собой разные цели и достигающие их разными способами. Подробнее здесь и здесь.

 , , ,

eao197
()

Compile-time рефлексия на c++1z

Форум — Development

Я тут с начала октября пишу свою реализацию с Compile-time рефлексии, и у меня в итоге появились первые результаты работы. Что в ней есть:

  • Счетчики методов/переменных
  • Получение/присвоение переменных через индекс
  • Поиск переменных по имени
  • Получение типа переменной
  • статичные переменные
  • Получение имени класса
  • запуск методов через индекс
  • получение типа возвращаемого значения метода, получение типов входных аргументов
  • константный методы
  • статичные методы
  • Поиск методов по имени
  • попытка запустить кучу методов (там кортеж из индексов на вход идёт) с данными аргументами, неудача не ведет к ошибки компиляции(sfinae)
  • Получение имени переменной/метода

Я пока не делал документацию, и оформление кода хромает. Но это все уже активно пилится. Зависимости: boost.hana, boost.type_index (только в первом примере используется). Из С++1z: Поддержка if constexpr (), std::conjunction.

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

Ссылка на проект

Первый пример

Второй пример

Скриншот выхлопа первого примера

Скриншот выхлопа второго примера

P.S: Да макросы и не красиво, но с таким функционал без них никак не обойтись.

P.S.S: В файле utils можно убрать namespace std {...} если у Вас std::is_*_v уже в стандартной библиотеке определены.

P.S.S.S: лицензия GPLv3.

 , ,

maxis11
()

Node.js & Callbacks

Форум — Development

Требуется из расширения Node.js на C++ периодически вызывать колбэк в Node.js. Оказалось, что это страшная боль в пятой точке, благодаря чудесной архитектуре v8. Насколько я понял, вызывать нодовские колбэки можно только из главного потока libuv. Если сами события, по которым должен осуществляться вызов, генерируются в других потоках, то делается это примерно так: http://stackoverflow.com/questions/36987273/callback-nodejs-javascript-functi... Вопрос: как это делать эффективно, если само событие генерируется сторонней библиотекой, при этом в качестве параметра передаётся большой массив данных, который и нужно прокинуть колбэку? Копировать этот массив и временно сохранять копию? Сторонняя библиотека, генерирующая событие, тоже с v8, но другой версии нежели в node.js. Или же можно как-то вызвать колбэк из другого потока?

 , ,

asaw
()

Посоветуйте толковые книги на русском/английском по Си++ (Cxx11)

Форум — Development

Посоветуйте толковые книги на русском/английском по Си++.
Чтобы был нормальный перевод и содержание.
У меня где-то лежит каталог с O'Reilly, надо бы посмотреть среди них. Ещё что-то брал по акции «книга за 1 рубль» в books.ru

В двух словах - я старпёр, который изучал Си/Си++ в 1996-1997 году по книжкам:
* В.В.Подбельский Язык Си++ (Финансы и статистика)
* Беляков М.И., Рабовер Ю.И., Фридман А.Л. Мобильная операционная система
* немного смотрел русский перевод Керниган-Ритчи в бумажном виде в библиотеке когда интернетов не было, а свою книгу купить - стипендия не позволяла
* в 2004-2005 году читал книгу Страуструп Б. Дизайн и эволюция С++

Все эти книги читал в бумажном варианте.

По работе писал только на Си с классами и на Паскале с классами (+Делфи). Сейчас хотел бы по-изучать Си++, чтобы понимать современный код. Какие книги посоветуете? Интересует компактное изложение фундаментальных основ, желательно - на русском языке. Или что-то не очень тяжёлое на английском (чтобы не надо было переводить каждое слово со словариком). Надеюсь, понятно объяснил. Спасибо.

Просто я встретил на днях код вида

A::B::C::D ...
, и понял, что пора догонять поезд. На университетских знаниях 20-летней давности сейчас делать почти нечего. Хочу перестать заниматься быдлокодерством, и начать осваивать современные знания.

Ещё - есть ли краткая табличка с основными различиями в стандартах (Comparison table/list)? Или лучше просто прочитать для начала Wikipidia:C++11, и составлять такую таблицу самому?

За что браться не следует однозначно новичку, что освоить для быстрого JFF-эффекта, если хорошо знал в своё время Си с классами? Нравится концепция namespaces. Ещё хотелось бы впоследствии плавный переход на какую-то функциональщину, чтобы знания по современному Си++ пригодились. Какие концепции/подходы есть общие?

 ,

Mirage1_
()

Что там с юнит-тестами..?

Форум — Development

Выбор стоит среди следующего:
- Boost test
- Google test
- CppUnit.

Есть какие-то особые преимущества у каждого из них? Целевые платформы x86 и arm.

 ,

UVV
()