В своей лекции по случаю вручения премии Тьюринга Кен Томпсон показал, как компилятор C может внедрить бэкдор в программу login и скрыть атаку даже от собственного исходного кода.
Сам компилятор становится бэкдором, не оставляя никаких следов в исходном коде.
👉 @Cpportal
Сам компилятор становится бэкдором, не оставляя никаких следов в исходном коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤18👀1
В оригинальном исходном коде Doom 1993 года кто-то оставил это в главном заголовочном файле.
У id Software явно было своё мнение о языках программирования.
👉 @Cpportal
У id Software явно было своё мнение о языках программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁42❤5🤣5👀3
Оптимизация кода — невероятно увлекательная тема.
Когда вы умножаете число на константу (например, на 24), LLVM заменяет инструкцию умножения (
Сдвиг влево на 3 бита эквивалентен умножению на 8, а инструкция
И всё это буквально ради экономии одного такта процессора! Ведь
Для множества других констант существуют таблицы с аналогичными эвристиками оптимизации. Разработчики оптимизирующих бэкендов компиляторов прилагают огромные усилия, чтобы сэкономить даже одну инструкцию, поэтому не сводите всю их работу на нет!
👉 @Cpportal
Когда вы умножаете число на константу (например, на 24), LLVM заменяет инструкцию умножения (
imul) комбинацией побитового сдвига влево (shl) и вычисления эффективного адреса (lea).Сдвиг влево на 3 бита эквивалентен умножению на 8, а инструкция
lea выполняет арифметические операции над выражением вида [base + index] и сохраняет полученный результат.И всё это буквально ради экономии одного такта процессора! Ведь
imul выполняется за 3 такта, а shl и lea — за 1 такт каждая.Для множества других констант существуют таблицы с аналогичными эвристиками оптимизации. Разработчики оптимизирующих бэкендов компиляторов прилагают огромные усилия, чтобы сэкономить даже одну инструкцию, поэтому не сводите всю их работу на нет!
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍25❤11🤯3🤔1
До стандартизации операторов присваивания в языке C использовались операторы с обратным порядком символов, например
Знаменитый фрагмент кода с комментарием «Вы не должны этого понимать» в те времена выглядел ещё более странно.
👉 @Cpportal
=+ вместо +=.Знаменитый фрагмент кода с комментарием «Вы не должны этого понимать» в те времена выглядел ещё более странно.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5❤3😁1🤔1
Оказывается,
Звучит очевидно, но я уже собирался писать для этого отдельную функцию, пока не заметил, что по сути просто изобретаю слегка приукрашенный
👉 @Cpportal
memcpy вполне неплохо подходит для сериализации.Звучит очевидно, но я уже собирался писать для этого отдельную функцию, пока не заметил, что по сути просто изобретаю слегка приукрашенный
memcpy.Please open Telegram to view this post
VIEW IN TELEGRAM
1❤14🤣7🤔3👍1
В Unix V7 (1979 года) команда
Она учитывала гласные, часто встречающиеся и редкие буквы.
Простая эвристика, которая в некоторой степени работает до сих пор.
👉 @Cpportal
file могла определять, написан ли текст на английском языке, анализируя частоту встречаемости букв.Она учитывала гласные, часто встречающиеся и редкие буквы.
Простая эвристика, которая в некоторой степени работает до сих пор.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥14❤7👀5
В сентябре 1992 года разработчики Unix столкнулись с серьёзной проблемой при работе с Unicode. Хранение символов в 16-битном представлении могло приводить к появлению нулевых байтов, которые программы на C воспринимали как признак окончания строки. Более ранние кодировки также имели свои недостатки совместимости.
Однажды вечером Кен Томпсон и Роб Пайк отправились в небольшую закусочную в Нью-Джерси. Там Томпсон набросал схему новой кодировки прямо на бумажной подложке для тарелки.
Её устройство позволяло полностью сохранить совместимость с ASCII. Остальные символы представлялись последовательностями из нескольких байтов, причём такое представление исключало случайное появление нулевых байтов и разделителей путей Unix.
Вернувшись в Bell Labs, разработчики приступили к реализации своего замысла. Уже к пятнице их операционная система Plan 9 целиком работала с новой кодировкой.
Так появилась UTF-8.
Сегодня, спустя более тридцати лет, эта кодировка используется более чем на 99% веб-сайтов, для которых известно представление символов.
👉 @Cpportal
Однажды вечером Кен Томпсон и Роб Пайк отправились в небольшую закусочную в Нью-Джерси. Там Томпсон набросал схему новой кодировки прямо на бумажной подложке для тарелки.
Её устройство позволяло полностью сохранить совместимость с ASCII. Остальные символы представлялись последовательностями из нескольких байтов, причём такое представление исключало случайное появление нулевых байтов и разделителей путей Unix.
Вернувшись в Bell Labs, разработчики приступили к реализации своего замысла. Уже к пятнице их операционная система Plan 9 целиком работала с новой кодировкой.
Так появилась UTF-8.
Сегодня, спустя более тридцати лет, эта кодировка используется более чем на 99% веб-сайтов, для которых известно представление символов.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥35👍4❤3
Forwarded from Arenadata
На ArenaTech инженеры Arenadata расскажут, как устроены продукты компании изнутри, поделятся опытом решения сложных инженерных задач и представят ключевые направления технологического развития.
После каждого доклада участники смогут задать вопросы спикерам в рамках Q&A-сессии.
Конференция будет интересна разработчикам, дата-инженерам, администраторам СУБД, архитекторам, DevOps-инженерам и техническим руководителям.
Формат: онлайн
Программа и регистрация
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В 1998 году Брайан Керниган захотел создать движок регулярных выражений, настолько компактный, чтобы его исходный код целиком поместился на одной странице книги по программированию.
Роб Пайк отправился к себе в кабинет и спустя час или два вернулся с реализацией примерно на 30 строках кода на языке C.
Движок поддерживал метасимволы ^, $, . и *, а его реализация практически целиком основывалась на указателях и рекурсии.
Позднее Керниган включил этот код в книгу «Beautiful Code» («Совершенный код»).
👉 @Cpportal
Роб Пайк отправился к себе в кабинет и спустя час или два вернулся с реализацией примерно на 30 строках кода на языке C.
Движок поддерживал метасимволы ^, $, . и *, а его реализация практически целиком основывалась на указателях и рекурсии.
Позднее Керниган включил этот код в книгу «Beautiful Code» («Совершенный код»).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍9😁8🤔1
Исходный код самой первой версии Linux 0.01, выпущенной в 1991 году, представляет немалый интерес.
В Makefile Линус Торвальдс использовал инструменты для работы с 16-битным ассемблером наряду с компилятором GCC, чтобы собрать загрузочный образ ядра.
А теперь взгляните, как он обрабатывал критическую ошибку ядра (kernel panic):
👉 @Cpportal
В Makefile Линус Торвальдс использовал инструменты для работы с 16-битным ассемблером наряду с компилятором GCC, чтобы собрать загрузочный образ ядра.
А теперь взгляните, как он обрабатывал критическую ошибку ядра (kernel panic):
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22❤5🤔2
В 1996 году студия Naughty Dog выпустила Crash Bandicoot для оригинальной PlayStation, у которой было всего 2 МБ оперативной памяти.
Некоторые уровни занимали более 10 МБ, поэтому загрузить целый уровень в память одновременно было невозможно.
Тогда программист Энди Гэвин разработал собственную систему виртуальной памяти, которая подгружала с компакт-диска блоки данных размером 64 КБ по мере того, как Крэш перемещался по игровому миру.
Обычно игра загружала около трёх таких блоков в секунду. Данные на диске располагались в тщательно рассчитанном порядке, чтобы подгрузка не прерывала игровой процесс.
Представьте: целые трёхмерные миры загружались с компакт-диска со скоростью чтения около 300 КБ/с, а игра при этом должна была работать с частотой 30 кадров в секунду.
И всё это на консоли всего с 2 МБ оперативной памяти.
👉 @Cpportal
Некоторые уровни занимали более 10 МБ, поэтому загрузить целый уровень в память одновременно было невозможно.
Тогда программист Энди Гэвин разработал собственную систему виртуальной памяти, которая подгружала с компакт-диска блоки данных размером 64 КБ по мере того, как Крэш перемещался по игровому миру.
Обычно игра загружала около трёх таких блоков в секунду. Данные на диске располагались в тщательно рассчитанном порядке, чтобы подгрузка не прерывала игровой процесс.
Представьте: целые трёхмерные миры загружались с компакт-диска со скоростью чтения около 300 КБ/с, а игра при этом должна была работать с частотой 30 кадров в секунду.
И всё это на консоли всего с 2 МБ оперативной памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯14❤3🌚1