• Почему для счётчиков не используют беззнаковые (unsigned) числа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Часто вижу в коде на C++ и C#, что для счётчиков … используют int, а не uint/unsigned int.
    Почему праграмисты делают это?

    Я слышал следующую теорию, почему это имеет смысл в С++: потому что значение знакового типа в корректно написанном коде не переполняется. (А если таки случилось переполнение, то это UB и всё уже не важно). Поэтому если счётчик имеет знаковый тип и с ним на каждой итерации происходит, например, инкремент, то значение счётчика только увеличивается. Это, в свою очередь, даёт дополнительные возможности для оптимизации. Беззнаковый счётчик инкрементируемый на каждой итерации может внезапно обнулиться, это может быть легальным поведением программы на которое рассчитывает программист.

    А почему они фактически используют int -- наверняка потому что никакой практической разницы не видно, а буков нужно меньше.
    Ответ написан
    2 комментария
  • Как передать двумерный массив функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как передать двумерный массив функции?

    https://qna.habr.com/answer?answer_id=513953#answe...
    Ответ написан
    Комментировать
  • Запуск python скрипта из bash. No such file or directory. Как это решить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "$str2$str1"
    '/usr/bin/python3 /opt/uccx-stats/uccx_parse.py /opt/uccx-stats/_uccx_csqstats.txt "FCCPS-CSQ - loggedinagents"'

    подскажите, как это победить

    убрать кавычки там где они не нужны, добавить кавычки там, где они нужны:
    #!/bin/bash
    set -x
    #Запуск скрипта в формате ./csqstats CSQ_name  param
    str1="$1 - $2"
    str2="/usr/bin/python3 /opt/uccx-stats/uccx_parse.py /opt/uccx-stats/_uccx_csqstats.txt"
    $str2 "$str1"
    Ответ написан
    Комментировать
  • Почему биты в регистре архитектуры AVR заносяться именно посредством сдвига 1 на этот бит влево?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему нельзя занести этот бит в регистр без сдвига, зачем это придумано
    UCSRA |= (1<<U2X);

    В заголовочных файлах U2X определён как "номер бита U2X в регистре UCSRA", т.е. 1.
    Если бы U2X был определён как "битовая маска поля U2X в регистре UCSRA" (т.е. 2), то все бы писали UCSRA |= U2X;. В ассемблерном коде avr оба эти варианта превратятся в инструкцию sbi UCSRA, 1, устанавливающую бит в регистре по номеру.

    Имея номер бита перевести его в битовую маску гораздо легче, чем наоборот, из маски вывести номер бита (который, в общем случае, может быть и не один), я думаю, что отчасти поэтому у программистов работающих с железом есть тенденция определять поля регистров через номера битов.
    Ответ написан
    Комментировать
  • Почему программа загружается в разных областях памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему программа каждый раз занимает различные области памяти?

    Потому что современные ОС делают это намеренно, чтобы затруднить эксплуатацию уязвимостей в ПО. Это называется ASLR: address space layout randomization. Обычно есть способ отключить ASLR глобально либо для отлаживаемых программ, чтобы добиться воспроизводимости результатов.
    Так, например, в linux это делается глобально с помощью файла /proc/sys/kernel/randomize_va_space либо командой setarch -R для одного конкретного процесса. Отладчик gdb по умолчанию отключает ASLR для отлаживаемых программ.
    Ответ написан
    3 комментария
  • Какой тип виртуальной памяти Сегментная или Страничная, сейчас используется? Как утроена виртуальная память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Чтобы прояснить картину адресации прочитай про линейный адрес и походи по ссылкам, ок?

    На виндовс, icore 5 процессоре вот сейчас, какой тип памяти работает. И какой тип виртуальной памяти на Risc 5 архитектурах.

    Забудь про сегментную организацию, она есть только в семействе x86, была сильно урезана в x86_64 и в современных ОС почти не используется.

    Вот запускается программа. Что происходит. Типа создается процесс, в MMU в таблице страниц генерируется номер страницы PID>>24 + 0x4000000h адрес примерно. И заноситься в таблицу (https://ru.bmstu.wiki/MMU_(Memory_Management_Unit) ) Создаются типа страницы для данных. Окей

    Это какое-то странное описание, особенно часть PID>>24 + 0x4000000h, это вообще что?
    Если программа получает новое адресное пространство, то оно изначально пустое, программа ни с кем его не делит. Есть вот такая книжка про организацию памяти в linux: https://pdos.csail.mit.edu/~sbw/links/gorman_book.pdf Рекомендую ознакомиться с главой 4.

    как программа вообще может в такой системе вызвать функцию из внешней библиотеки

    первым делом программа загружает внешнюю библиотеку в своё адресное пространство. Дальше уже понятно?

    Что за таблица дескрипторов. Где она находиться.

    Находится где-то в физической памяти. Определяет свойства, размеры сегментов и в какие линейные адреса преобразуются логические адреса внутри этих сегментов. Если ты прочитал про линейные адреса эта часть должна тебе быть понятна. В современных ОС все процессы используют один и тот же селектор для кода и один и тот же селектор для данных, а логические адреса cs:0 ds:0 es:0 и ss:0 транслируется в линейный адрес 0. Это называется "плоская модель памяти".

    Как связана с таблицей страниц?

    Никак. Совершенно ортогональная структура, может работать даже когда страничная адресация выключена.

    Что в конечном итоге храниться TLB буфере????

    Мэппинг "линейный адрес" -> "физический адрес".
    Ответ написан
  • Как показать переменную на русском языке LCD_1602_RUS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как можно вставить сюда переменную?

    Сюда можно вставить переменную тип которой -- wchar_t *
    Ответ написан
    8 комментариев
  • Как разделить передаваемые программе аргументы в баш-скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С минимальными изменениями можно сделать вот такой рабочий вариант:
    #!/bin/bash
    function generateArgs(){
     echo --arg1=$somevar1 \"--arg2=$somevar2 and spaces\" ... --arg1337=$somevar1337
    }
    eval "args=($(generateArgs))"
    exec java "${args[@]}"

    Т.е. каждый отдельный аргумент в котором могут быть пробелы вывести с кавычками и собрать их в массив. Элементы массива в подстановке "${args[@]}" передаются поотдельности и пробелы внутри них обрабатываются правильно.

    Но это, конечно, коряво и лучше переделать функцию, чтобы она собирала массив аргументов по-человечески.
    Ответ написан
    Комментировать
  • Какие есть специфичные функции для glibc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    с чем могут возникнуть проблемы

    Можно начать отсюда.
    Из моего опыта, самое часто всплывающее отличие glibc от других libc -- поддержка версионирования символов.
    Ответ написан
  • Точка останова, Ptrace. Почему крашится программа после снятия точки останова?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чем проблема? Что я делаю не так?

    Я подозреваю, что не нужно делать regs.rip -= 1 ;, потому что процесс не может "выполнить" точку останова.
    Ну и для надёжности, я бы убедился, что в памяти куда пишется 0xcc действительно до этого было 0x55.
    Ответ написан
  • Как задать выравнивание в массиве?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Могу ли я не используя vec4, задать выравнивание элементам массива?

    Не используя для элементов массива другой тип -- нет, не можешь. Не обязательно испольовать для этого vec4, можно завести какой-нибудь другой тип, породив его от vec3 и задав нужное выравнивание.
    Ответ написан
    Комментировать
  • Шифрование для защиты от MITM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно ли как-то защититься от этого; есть ли для этого какие-то специальные протоколы?

    Для этого бывают key signing party, когда сопоставление ключа и владельца происходит очно.
    Либо PKI, если не стрёмно отдать эту функцию на аутсорс.
    Ответ написан
    Комментировать
  • Как в конвейерном 32bit процессоре передается команды записи в Reg 32 Битного значения??

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А как передать-то 32 битное значение в команде в 32 бит?
    Логично что после команды значение(или адрес). Но тогда же получается какое-то нарушение логики.

    В RISC-процессорах -- никак. Они либо имеют команду загрузки 32-битного значения (литерала) из памяти относительно PC или специально выделенного регистра (например ARM: LDR r [pc, #offset_to_literal_pool], XTENSA: l32r at, label), при этом в команде кодируется смещение адреса литерала относительно PC. Либо загружают значения по частям, двумя или более командами (например MIPS загружает 16-битные части двумя разными инструкциями: lui rt, high16 ; ori rt, low16, XTENSA загружает 16-битные части двумя одинаковыми инструкциями: CONST16 at, high16 ; CONST16 at, low16, RISC-V загружает 20 и 12-битные части: auipc rd, symbol[31:12] ;addi rd, rd, symbol[11:0]).
    Хотя в принципе тот же RISC-V имеет нефиксированную длину команд, так, что какой-нибудь разработчик может завести, скажем, 6-байтовую команду загрузки 32-битного непосредственного значения в регистр, однако, насколько мне известно, никто этого не делает.
    Ответ написан
    Комментировать
  • Что находится по этому адресу в памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему дефолтные значения выглядят так (первые два скришота)

    Потому что это адреса. 8 байт адреса, на втором скрине первый -- 0x12df11a80, второй -- 0x12df11a60
    Ответ написан
    2 комментария
  • Почему timeout неправильно завершает скрипт?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Timeout шлёт сигнал sigint если приложение не завершилось за определенное время.

    Нет, по умолчанию он шлёт SIGTERM. Чтобы он слал SIGINT воспользуйтесь ключом --signal=INT (см).

    Почему после окончания таймаута, утилита завершается, но без надписи "session saved"?

    Потому что не тот сигнал?
    Ответ написан
    Комментировать
  • Описание грамматики, где ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот описание

    Это описание не компилируется в силу его неполноты. Приведи полный, собирающийся текст.
    Ответ написан
    Комментировать
  • Почему не работает ввод?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Иван Четчасов в твоих вопросах повторяется один и тот же паттерн: у тебя что-то не работает, ты приводишь обрывок кода (обычно не относящийся к проблеме) и ничего не говоришь о том, как ты пытался решить проблему.
    Я предлагаю тебе сделать следующее с этим и всеми последующими вопросами:
    - добавить в вопрос ссылку на репозиторий со всем кодом который можно было бы склонировать и собрать
    - добавить в вопрос описание того, как ты запускаешь код, так, чтобы кто угодно мог воспроизвести твои результаты
    - добавить в вопрос описание того, как ты пытался диагностировать и решить проблему

    Без этого создаётся впечатление, что ты просто приходишь сюда покрасоваться.

    В приведённом коде я не вижу никаких проблем.
    Ответ написан
    3 комментария
  • Как обойти iOS ASLR используя LLDB?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Начало TEXT минус конец PAGEZERO, получается 0x104a60000 - 0x100000000 = 0x4a60000 (делта смещение)

    Ты что-то странное тут посчитал. TEXT у тебя лежит начиная с адреса 0x104a60000, вот этот адрес и надо использовать.

    Вот адрес ,к примеру, на котором я хочу установить breakpoint

    Тебе ещё надо знать, с какого адреса T начинается TEXT в дизассемблере. Тогда для произвольного адреса A внутри TEXT адрес в отладчике будет A - T + 0x104a60000.
    Ответ написан
    Комментировать
  • Как загрузить ядро тиа ELF через службы UEFI (gnu-efi)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я пытаюсь загрузить 64-битное ядро по адресу 0x1000

    Я вижу в этом коде три проблемы:
    1. AllocatePages только возвращает адрес выделенной памяти по адресу в последнем параметре. Т.е. куда будут загружены сегменты ELF сказать нельзя и, соответственно, без динамической релокации этот ELF скорее всего работать не будет.
    2. Нет гарантии, что между блоками памяти выделенными через AllocatePages будет то же расстояние, что и между сегментами ELF, в то время как кодогенерация с флагом -fPIE вполне может считать это расснояние неизменным. Такой ELF нужно загружать в один большой блок памяти, сохраняя расстояние между сегментами.
    3. В следствие пункта 1 запуск ядра по адресу header.e_entry -- это прыжок в неизвестность.
    Ответ написан
    Комментировать
  • Для чего класть в стек регистр в начале функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Конкретно эта последовательность помимо тупо сохранения rbp создаёт разметку кадров стека. Если все функции в цепочке вызовов делают так, то из любой функции можно проследить всю цепочку вызовов до неё зная только текущее значение rbp без какой бы то ни было дополнительной отладочной информации, потому что по адресу в rbp хранится rbp предыдущей функции, а по адресу rbp + 8 -- адрес возврата в предыдущую функцию. Но делать это, конечно же, необязательно. Например gcc вызванный с флагом -fomit-frame-pointer генерирует код без этой последовательности и использует rbp как ещё один регистр общего назначения.

    Почему тогда все регистры не помещаются в стек?

    Потому что есть документ называемый psABI, который определяет, какие регистры должна сохранять вызываемая функция. Например: x86_64 psABI, раздел 3.2.1 "Registers".
    Ответ написан
    Комментировать