Системное программирование (C, C++, RUST)

  • Для отладки кода C, в том числе даже таких крупных проектов (напр. пропусков атак в них) как snort/suricata можно и нужно использовать отладчик GDB.
The GNU Debugger (GDB) is a portable debugger that runs on many Unix-like systems and works for many programming languages, including Ada, Assembly, C, C++, D, Fortran, Haskell, Go, Objective-C, OpenCL C, Modula-2, Pascal, Rust and partially others.
  • Для отладки взаимодействия приложения и ядра Linux обычно используют strace. Может быть полезен в разных сценариях – напр. в логах системы/приложения недостаточно информации об ошибке (или не удалось найти логи/логи не пишутся/выводятся), вплоть до простейших ошибок вида отсутствия необходимых прав.
strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state.
  • Есть дискуссия, в которой ряд крупных разработчиков/контор просят добавить поддержку C++ в ядро Linux совместно с текущим кодом на C/ассемблерными вставками и RUST. Причем C++ по их мнению потенциально лучше rust.
  • Разумная критика С 🙂
In the last few days, Linux maintainers disclosed a broadly available Linux kernel vulnerability that enables attackers to escape containers and get full control over the node. To be able to exploit this vulnerability, the attacker needs to be able to run code in the container and the container must have CAP_SYS_ADMIN privileges. Linux kernel and all major distro maintainers have released patches.

https://www.opennet.ru/opennews/art.shtml?num=56556

При передаче слишком большого параметра можно вызвать переполнение целочисленной переменной, используемой для расчета размера записываемых данных - в коде имеется проверка выхода за границу буфера "if (len > PAGE_SIZE - 2 - size)", которая не срабатывает, если значение size больше 4094 из-за целочисленного переполнения через нижнюю границу (integer underflow, при приведении 4096 - 2 - 4095 к unsigned int получится 2147483648).

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

> А квалификация раст программистов даже не позволит им понять что нужно сделать с тремя переменными ...
Как смешно ты извиваешься :)
А факт в том что это С программисты не справились с чиселками. Да не абы какие, а допущенные к ядру.
Не только, это же еще прошло кучу ревью, одобрено и вмерджено ментейнером.

>Просто твоя картина мира не позволяет тебе понять что раст этому никак не поможет.
Просто твоя картина мира не позволяет тебе понять что если разработчик меньше будет тратить времени на подсчеты выделений памяти и освобождений, то ему больше времени останеться на вот такие бажки.
rust
  • pingora – сетевой проект на базк rust от cloudflare
Компания Cloudflare открыла код Pingora, инструментария для создания сетевых сервисов https://opennet.ru/60722/
Pingora is a Rust framework to build fast, reliable and programmable networked systems.
Pingora is battle tested as it has been serving more than 40 million Internet requests per second for more than a few years.
C

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

надоело объяснять чем указатель отличается от значения по указателю

С указателями бывают разные проблемы, например – падение кода (продукта) в связи с разыменованием нулевого указателя.

Разыменование нулевого указателя (CWE-476) представляет собой дефект, когда программа обращается по некорректному указателю к какому-то участку памяти. Такое обращение ведет к неопределенному поведению программы, что приводит в большинстве случаев к аварийному завершению программы.
Блокировки/работа с потоками
  • «Хэш-таблицы как правило не потоко-безопасные, поэтому либо мютекс, либо спинлок» (dpdk chat)

Mutex – считается самым медленным способом блокировки/синхронизации потоков, может значимо тормозить код. Поэтому когда можно без него – его не используют (код review можно не пройти из-за реализации решения с помощью mutex). Как альтернатива atomic или lock. Они считаются быстрее.

dpdk chat
доброе утро, в документации к eventdev сказано, что "Atomic scheduling on a queue ensures that a single flow is not present on two different CPU cores at the same time." Значит ли это, что два события с одинаковым flow id попадут на одно и то же ядро? Если да, то это условие выполняется независимо от того, сколько времени прошло между этими событиями?
http://demin.ws/blog/russian/2012/05/05/atomic-spinlock-mutex/

Leave a Reply