All streams
Search
Write a publication
Pull to refresh
21
0.2
Send message

История про MITM-атаку IRL на чай показалась самой интересной частью статьи.

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

А в данном случае я подкрутил параметр net.ipv4.ip_unprivileged_port_start=80

[repr(packed)], да, как -то делал на расте, так потом компилятор не даёт ЧИТАТЬ из полей структуры, типа они у тебя лежат по невыровненному адресу, заведи временную переменную, скопируй из поля значение и уже работай с ним.

Дико неудобно, в итоге создал две структуры, одна [repr(packed)] для сериализации/десериализации, другая обычная. Возможно, финальная версия кода была переписана с использованием библиотеки https://github.com/bincode-org/bincode

Недавно случайно узнал, что в микроконтроллерах avr есть команда "проверить условие, и если истина, то пропустить следующую команду". А что? Длина машинной команды фиксированная (4 байте в семействе mega, если не ошибаюсь), так что довольно просто сделать PC+4.

Тогда уж так:

class User
{
public:
    User(int userid, std::string password) : m_userid(userid), m_password(password), m_cash(0.0) {}
private:
    int m_userid;
    std::string m_password;
    double m_cash;
}

Так такая команда в x86 чуть ли не единственная :(
Вон в arm: таких аж целая куча суффиксов: https://www.davespace.co.uk/arm/introduction-to-arm/conditional.html

У вас в организации есть требование: «Последовательность объявления static функций должна совпадать с последовательностью определения static функций в конце *.с файла.»

Нет варианта "Запрещены объявления static функций".

писать что-то подобное const int &i лишено смысла

Линтер раста на подобное ругается:

warning: this argument (4 byte) is passed by reference, but would be more efficient if passed by value (limit: 8 byte)
 --> src/main.rs:4:16
  |
4 | fn func(value: &i32) {
  |                ^^^^ help: consider passing by value instead: `i32`
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref
note: the lint level is defined here
 --> src/main.rs:3:8
  |
3 | #[warn(clippy::trivially_copy_pass_by_ref)]
  |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

У меня на одной из машине подкручены параметры ядра и порт 80 слушает непривилегированный процесс (не root).

А можно пойти проще: полностью сгенерированные заголовочные файлы. Даже самописный парсер грамматики должен оказаться не слишком сложным. Берётся cpp-файл и парсится сверху вниз. Встретили функцию - сгенерировали для неё объявление с комментарием. Если функия статическая - пропускаем.

Другие разработчики могут продолжать добавлять в h-файл свой код, просто при следующем запуске генератора файл перезатрётся.

Отличное замечание. PVS-Studio не устаёт повторять, что нужно учитывать настройки компилятора, флаги компилятор и параметры сборки (какие-нибудь добавляемые макросы).

Так что правильнее уже парсить препроцессированный исходник (после выхлопа препроцессора).

Где-то точно есть такой сабреддит, где писать могут только боты.

Какого цвета стоп-кран в самолете?

Нет такого предмета как стоп-кран в самолете.

<reflection> Остановился на этой мысли, поскольку действительно, в самолетах нет таких конструкций, которые называются стоп-краниками.

Если вы программист на Си, то почему бы не написать собственный линтер на Си и не городить десятки make-файлов? Так уж и быть, линтер вызывать из make-файла.

Имхо, проще питоновский скрипт переписать, чем сверху фильтрацию городить.

Сам писал линтер на pl/sql для pl/sql. Умеет находить неиспользуемые переменные, нарушения кодестайла и возможные мини-оптимизации кода. Можно заглушить предупреждение в коде комментарием noqa. Пример выхлопа:

XXX_PACK:531 тип varchar вместо varchar2
XXX_PACK:532 не указан char
XXX_PACK:630 неиспользуемая аргумент P_ID_IP
XXX_PACK:649 неиспользуемая переменная ID_IP
XXX_PACK:649 имя переменной ID_IP не начинается с префикса l_
XXX_PACK:1494 имя аргумента L_DIS_UP не начинается с префикса p_
XXX_PACK:1530 имя курсора ANK_LIST не равно l_c или не начинается с префикса c_
XXX_PACK:1643 вызов тяжёлой pl/sql функции v() внутри sql
XXX_PACK:1860 вызов тяжёлой pl/sql функции v()
XXX_PACK:6591 вызов pl/sql функции nvl() вместо sql функции coalesce()

Линтер кода. Не путать с линковщиком (компоновщиком).

Ага 4-х канальная и не греется, в отличии от биполярных транзисторов. Встроенная защита от перегрева.

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

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

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

Даже интереснее, если реализовать хранение в двоичной системе исчисления, схема станет сложнее или проще? При десятичной системе нам потребуется хранить 10 "бит" данных - один из "битов" всегда включён, остальные выключены. При двоичной нам потребуется log2(10) = 3.3 = 4 бита (даже с запасом, значения от 0 до 15 включительно).

Кстати, в то время уже были 4-х битные микросхемы логики, так что для счётчика останется накидать элементов 2И-НЕ, чтобы правильно реализовать бит переноса:
00:09 + 1 = 00:10 - то есть принудительно обнулить младший разряд.
00:59 + 1 = 01:00

Дополнительно существуют готовые микросхемы, на вход которых подаётся 4-х битное число, на выходе - сигналы для семисегментных индикаторов.

Итого, в 20-30 логических микросхем можно уложиться для создания часов.

Раньше во времена 16 битного x86 действительно вызывали прерывания BIOS и (или) DOS.

В статье показан 64 битный x86-64 и вызов системных вызовов ядра линукса 2.6.35+

Information

Rating
2,552-nd
Registered
Activity

Specialization

Application Developer
Software development
Database
Oracle PL/SQL
Oracle SQL
Linux administration
Python
Rust
Git
Database administration
Oracle administration