Ответы пользователя по тегу Assembler
  • Как в C++ распределяется память?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Смотря что именно подразумевается под "создать массив" )) Вот хорошая шпаргалка на тему, что это может означать и где он в результате окажется:

    int arr1[100000]; // BSS
    vector<int> arr2; // HEAP
     
    struct DumbStruct {
        int someArr[10000];
    };
     
    int main () {
        int arr3[100000]; // STACK
        vector<int> arr4; // HEAP
        int* arr5 = new int[100000]; // HEAP
        int* arr6 = (int*) malloc(100000 * sizeof(int)); // HEAP
        static int arr7[100000]; // BSS
        DumbStruct struct; // STACK
        DumbStruct* struct2 = new DumbStruct(); // HEAP
        vector<DumbStruct> structarr; // HEAP
        int n;
        scanf("%d", &n);
        int arr8[n]; // STACK (assuming C99 -- this does not compile in C++)
    }


    Если речь именно о динамическом выделении памяти и именно о С++, то есть два варианта: malloc()/free() и new[]/delete[]. Теоретически в случае фрагментации памяти (когда ее, в принципе, достаточно, но не "одним куском") ни тот, ни другой не "заполнит" никаких "свободных" ячеек. malloc() вернет NULL, a new[] кинет std::bad_alloc.

    А практически, конечно, возможно, что угодно... т.к. 1. new - это оператор, и значит, его можно переопределить, 2. с помошью std::set_new_handler ему можно подсунуть свой аллокатор, а также 3. полезет ли new[] вообще к malloc(), строго говоря, не гарантируется и, наконец 4. реализация malloc(), вообще-то, зависит от ОС, а они нынче умные и могут прореагировать как угодно - вплоть до убийства затребовавшего память процесса OOM менеджером.

    Так что, наиболее точный ответ на вопрос: возможны варианты (хорошие и разные)... Однако, если суть вопроса в том, а не получится ли при этом случайно массив, который не массив, то ответ - нет, не получится. Массив, это семантическая конструкция языка. В С++ программист может полагаться на то, что память в массиве непрерывна.
    Ответ написан
    5 комментариев
  • Как используется ассемблер в хакерстве?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Простейшие программы на ассемблере, используемые "в хакерстве", зачастую удивительно лаконичны и состоят из одной единственной инструкции NOP, проставленной в нужном месте взламываемого бинарника... искусство их написания заключается в нахождении этого самого места, для чего может понадобится даже предварительное написание других программ на других языках и еще много чего. Ну, а из прикладной бытовухи, на нем можно написать, например, прошивку для девайса, перехватывающего какой-нибудь RFID-радиообмен или перебирающего пароли. И то, и другое, вроде как, хакерство... только сроки дают разные :)
    Ответ написан
    Комментировать