Да, многие приложения сбрасывают привилегии и оставляют их только для прослушивания порта. Сейчас довольно удобным стал selinux, который ещё больше защищает систему.
А в данном случае я подкрутил параметр net.ipv4.ip_unprivileged_port_start=80
[repr(packed)], да, как -то делал на расте, так потом компилятор не даёт ЧИТАТЬ из полей структуры, типа они у тебя лежат по невыровненному адресу, заведи временную переменную, скопируй из поля значение и уже работай с ним.
Дико неудобно, в итоге создал две структуры, одна [repr(packed)] для сериализации/десериализации, другая обычная. Возможно, финальная версия кода была переписана с использованием библиотеки https://github.com/bincode-org/bincode
Недавно случайно узнал, что в микроконтроллерах avr есть команда "проверить условие, и если истина, то пропустить следующую команду". А что? Длина машинной команды фиксированная (4 байте в семействе mega, если не ошибаюсь), так что довольно просто сделать PC+4.
У вас в организации есть требование: «Последовательность объявления static функций должна совпадать с последовательностью определения static функций в конце *.с файла.»
Нет варианта "Запрещены объявления static функций".
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)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
А можно пойти проще: полностью сгенерированные заголовочные файлы. Даже самописный парсер грамматики должен оказаться не слишком сложным. Берётся cpp-файл и парсится сверху вниз. Встретили функцию - сгенерировали для неё объявление с комментарием. Если функия статическая - пропускаем.
Другие разработчики могут продолжать добавлять в h-файл свой код, просто при следующем запуске генератора файл перезатрётся.
Отличное замечание. PVS-Studio не устаёт повторять, что нужно учитывать настройки компилятора, флаги компилятор и параметры сборки (какие-нибудь добавляемые макросы).
Так что правильнее уже парсить препроцессированный исходник (после выхлопа препроцессора).
Если вы программист на Си, то почему бы не написать собственный линтер на Си и не городить десятки 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()
Меня даже заинтересовало как можно сделать часы на транзисторной рассыпухе.
По факту часы - это большой счётчик. С генератором проще: какой-нибудь мультивибратор 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 логических микросхем можно уложиться для создания часов.
История про 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.
Тогда уж так:
Так такая команда в x86 чуть ли не единственная :(
Вон в arm: таких аж целая куча суффиксов: https://www.davespace.co.uk/arm/introduction-to-arm/conditional.html
Нет варианта "Запрещены объявления static функций".
Линтер раста на подобное ругается:
У меня на одной из машине подкручены параметры ядра и порт 80 слушает непривилегированный процесс (не root).
А можно пойти проще: полностью сгенерированные заголовочные файлы. Даже самописный парсер грамматики должен оказаться не слишком сложным. Берётся cpp-файл и парсится сверху вниз. Встретили функцию - сгенерировали для неё объявление с комментарием. Если функия статическая - пропускаем.
Другие разработчики могут продолжать добавлять в h-файл свой код, просто при следующем запуске генератора файл перезатрётся.
Отличное замечание. PVS-Studio не устаёт повторять, что нужно учитывать настройки компилятора, флаги компилятор и параметры сборки (какие-нибудь добавляемые макросы).
Так что правильнее уже парсить препроцессированный исходник (после выхлопа препроцессора).
Где-то точно есть такой сабреддит, где писать могут только боты.
Нет такого предмета как стоп-кран в самолете.
<reflection> Остановился на этой мысли, поскольку действительно, в самолетах нет таких конструкций, которые называются стоп-краниками.
Если вы программист на Си, то почему бы не написать собственный линтер на Си и не городить десятки make-файлов? Так уж и быть, линтер вызывать из make-файла.
Имхо, проще питоновский скрипт переписать, чем сверху фильтрацию городить.
Сам писал линтер на pl/sql для pl/sql. Умеет находить неиспользуемые переменные, нарушения кодестайла и возможные мини-оптимизации кода. Можно заглушить предупреждение в коде комментарием
noqa
. Пример выхлопа:Линтер кода. Не путать с линковщиком (компоновщиком).
Ага 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+