Задать вопрос
  • Как сделать новое чтение из STDIN?

    includedlibrary
    @includedlibrary
    Могу ли я теперь как то сделать новый вызов read из stdin в новый кусок памяти?

    Да, точно так же, как и до этого.

    Как правильно закрыть старый?

    Что значит закрыть? Закрывают обычно файловые дескрипторы и сокеты, но после этого из них уже нельзя читать данные. После вызова read надо обработать ошибку, если она была, но закрывать ничего не нужно.
    Написано
  • Необходима ли виртуальная страничная адресация в 4Гбайта при наличии ОЗУ емкостью 4Гбайта и почему?

    includedlibrary
    @includedlibrary
    15432, Да, я ещё забыл упомянуть про swap и про то, что отпадает необходимость думать, по какому адресу грузится программа, чтобы никакие две программы не пересекались.
    Написано
  • Покажите на ассемблере как выглядит защита от переполнения буфера?

    includedlibrary
    @includedlibrary
    Sasha_88, Магии там никакой нет - проверка, что индекс больше нуля и меньше размера массива, если она не проходит, то вызывается процедура, которая кидает исключение. Получается, что такая простая проверка защитит от переполнения буфера, потому что, чтобы его переполнить надо записать больше, чем он может вместить. В инструкциях ассемблера - это cmp, jcc и call.
    Написано
  • Покажите на ассемблере как выглядит защита от переполнения буфера?

    includedlibrary
    @includedlibrary
    Sasha_88, Ну так а при чём тут компилятор? at - это библиотечный метод, он не является частью компилятора. Его исходники можно посмотреть, достаточно скачать код стандартной библиотеки c++
    Написано
  • Покажите на ассемблере как выглядит защита от переполнения буфера?

    includedlibrary
    @includedlibrary
    Какой конкретно компилятор? В C/C++ компилятор никакие проверки за вас делать не будет. Компиляторы языков, у которых проверки прописаны в стандарте, реализуют их по-разному. Сначала идёт проверка, что индекс >= 0 и индекс < размера массива, если проверка не проходит, то дальше вызывается процедура, которая генерирует исключение или останавливает программу и выводит стектрейс или что-то ещё. Также в некоторых случах компиляторы не вставляют такие проверки, если при статическом анализе удалось подтвердить, что выхода за границы точно не будет.

    Upd: На самом деле, можно сказать gcc/clang, чтобы он добавлял различные проверки при работе с памятью, добавив флаг -fsanitize=address. Алгоритм работы описан тут https://github.com/google/sanitizers/wiki/AddressS...,
    Написано
  • Как корректно вывести функцию в байтовом виде?

    includedlibrary
    @includedlibrary
    Я не уверен, что можно сделать платформо и компиляторонезависимое решение. Я для своих нужд использовал таблицу символов в ELF файлах (в PE принцип тот же), которую генерирует GCC. Алгоритм был следующий:
    1. Добавляем в скрипт компоновщика символ для хэш-таблицы с именами и размерами функцмй пока что с размером равным нулю, в коде программы обращаемся к этой таблице, как-будто бы она уже заполнена (делаем поиск по имени функции, получаем по нему размер и далее делаем с размером то, что нам нужно).
    2. Компилируем программу.
    3. Пишем другую программу, которая будет смотреть полученный на предыдущем шаге ELF файл, доставать из таблицы символов функции и их размеры, заполнять хэш таблицу и записывать её в отдельный файл.
    4. Пишем новый скрипт компоновщика, в котором вместо символа с нулевым размером, создаём символ с тем же именем с размером и содержимым файла, полученным на предыдущем шаге
    5. Компилируем программу снова с использованием скрипта компоновщика, созданного на предыдущем шаге
    Написано
  • Как использовать строку в качестве названия функции в GoLang?

    includedlibrary
    @includedlibrary
    А что вы хотите сделать в итоге? Самый просто способ - сделать map[string]func() вместо func() подставьте нужную вам сигнатуру. Если у функций может быть разный набор аргументов, можно создать map[string]any, но тогда придётся делать приведение any к нужному типу, отчего весь смысл теряется:

    package main
    
    import "fmt"
    
    func read() {
    	fmt.Println("read")
    }
    
    func write() {
    	fmt.Println("write")
    }
    
    var funcs = map[string]func(){
    	"read":  read,
    	"write": write,
    }
    
    func main() {
    	funcs["read"]()
    	funcs["write"]()
    }
    Написано
  • Зачем нужен Wayland и что нужно чтобы нарисовать пиксель на экране?

    includedlibrary
    @includedlibrary
    Дмитрий, Вы правы. Неверно выразился. Я имел в виду, что в Wayland принято, что каждый менеджер окон реализует данный протокол и, соответственно, является сервером. В среде X11 (тут хоть и возможно более одной реализации, но почти все используют X.org) менеджер не является сервером, он является клиентом X сервера.
    Написано
  • Как скомпилировать win-iconv не имея опыта?

    includedlibrary
    @includedlibrary
    Простой Человек, В arch linux, очевидно нет windows.h, потому что это linux, а не windows. Будет ли проще через студию, я не знаю. Можете попробовать, там как раз есть CMakeLists.txt можно сгенерировать проект для студии
    Написано
  • Зачем нужен Wayland и что нужно чтобы нарисовать пиксель на экране?

    includedlibrary
    @includedlibrary
    Единственная проблема - ваша программа в таком случае не будет корректно работать на большинстве систем, потому что большинство пользователей работает либо под X11, либо под менеджером, который реализует Wayland
    Написано
  • Зачем нужен Wayland и что нужно чтобы нарисовать пиксель на экране?

    includedlibrary
    @includedlibrary
    что разработчикам FireFox не нужно тратить время на GTK и лучше сразу портировать браузер на Wayland.


    GTK - это библиотека для построения GUI, она уже портирована под wayland, соответсвенно, всё что её использует и не завязывается на X11 тоже должно работать под wayland. Firefox уже работает под wayland без использования xwayland, проверено лично.

    Допустим у нас нет GTK и я хочу отрисовать пиксель на экране. Что для этого нужно? Нужен ли для этого Wayland и кукую роль он будет играть?

    X11 - это сервер, который позволяет создавать окна и что-то отрисовывать. Wayland - это только протокол. Вы создаёте оконный менеджер, который обрабатывает запросы по протоколу Wayland, соответсвенно приложения должны эти запросы делать в соответствии с протоколом для создания окон и каких-либо ещё действий с ними. То есть в случае X11 есть одна реализация сервера, в случае с Wayland - тысячи их. Для отрисовки графики вам нужен драйвер видеокарты и программа, которая с ним взаимодействует. То есть вам не нужен ни Wayland, ни X11. Вы можете использовать EGL напрямую
    Написано
  • Как скомпилировать win-iconv не имея опыта?

    includedlibrary
    @includedlibrary
    А запуск make не помогает? Если что, make и gcc под винду можно взять здесь https://github.com/skeeto/w64devkit/releases/
    Написано
  • Как вычисляется цвет пикселя во фрагментном шейдере?

    includedlibrary
    @includedlibrary
    Цикл for выполняется для каждого пикселя. Цета пикселей различаются, потому что есть зависимость цвета от координаты пикселя:

    // uv зависит от текущей координаты
    vec2 uv = (gl_FragCoord.xy - 0.5 * resolution.xy) / resolution.y;
    
    /* Этот цикл выполняется для каждого пикселя */
    for (float i = 0.0; i < 60.0; i += 1) {
        /* ... */
        col += 0.001 / length(uv - vec2(dx + 0.1, dy)); // Есть зависимость от uv, то есть от координаты
    }
    Написано
  • Как настроить CMake на установку пакетов?

    includedlibrary
    @includedlibrary
    Я не плюсовик, конечно, но через CMake обычно никто ничего не ставит. Обычно как раз пишут, мол, установи то-то и то-то, потом уже собирай. Мой опыт основывается только на сборке пакетов из исходников.
    Написано
  • Как сделать графику на fasm?

    includedlibrary
    @includedlibrary
    Например, есть такая статья https://habr.com/ru/companies/neobit/articles/176707. Но вообще странно сейчас думать о графике, нужно сначала основные части ОС написать (планировщик, файловая система, поддержку устройств ввода-вывода, системные программы), а потом уже думать о графике.
    Написано
  • Код на си начинает бесконечный цикл. Что делать?

    includedlibrary
    @includedlibrary
    Ещё стоит заметить, что определение функции внутри другой функции, не определено в стандарте языка
    Написано
  • Для чего тесты пишут?

    includedlibrary
    @includedlibrary
    0x80070005, Сначала проект малый, потом он становится большим. Если он никогда не перестанет быть малым, то тесты можно и не писать, при условии, что вы разрабатываете в соло, а не в команде
    Написано
  • Для чего тесты пишут?

    includedlibrary
    @includedlibrary
    Ну вот допустим мы сделали модальное окно и тест для него. Мы же можем это модальное окно в ручную проверить, без теста


    Можете, но каждый раз добавляя какие-то изменения после этого, вы должны проверить не только новую функциональность, но и старую, чтобы убедиться, что ничего не сломали
    Написано