Переполнение буфера (по сравнению с) переполнением буфера (по сравнению с) переполнением стека [дубликат]

Да, энергозависимый должен использоваться каждый раз, когда Вы хотите, чтобы изменяемая переменная была получена доступ несколькими потоками. Это не очень общий вариант использования, потому что обычно необходимо выполнить больше, чем единственная атомарная операция (например, проверить переменное состояние прежде, чем изменить его), в этом случае Вы использовали бы синхронизируемый блок вместо этого.

8
задан Community 23 May 2017 в 12:30
поделиться

4 ответа

Думайте о буфере как о массиве. Люди часто используют «переполнение» и «переполнение» как синонимы всякий раз, когда вы пытаетесь сослаться на индекс за пределами конца массива. Лично я делаю различие:

переполнение буфера - это когда вы пытаетесь поместить в массив больше элементов, чем может вместить массив. Другими словами, это происходит из письменности .

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

Переполнение стека сильно отличается. Большинство современных сред программирования основаны на стеке, где они используют структуру данных стека для управления потоком программы. Каждый раз, когда вы вызываете функцию, в стек вызовов программы помещается новый элемент. Когда функция возвращается, элемент извлекается из стека. Когда стек пуст, программа останавливается. Дело в том, что этот стек имеет ограниченный размер. Можно вызвать слишком много функций одновременно и заполнить стек. На этом этапе у вас переполнение стека. Наиболее распространенный способ сделать это - когда функция вызывает себя (рекурсия).

31
ответ дан 5 December 2019 в 04:36
поделиться

Bufferoverflow / Bufferoverrun:

void k()
{
    BYTE buf[5];
    for( int i = 0; i < 10; ++i )
        buf[i] = 0xcd;
}

Stackoverflow:

void f()
{
     int k = 0;
     f();
}
16
ответ дан 5 December 2019 в 04:36
поделиться

Вы можете различать переполнение буфера и переполнение буфера в C / C ++:

  • Мы могли бы определить переполнение, когда вы индексируете / указываете за пределы исходный размер буфера (например, считывание 6-го элемента массива из 3-х элементов)
  • Мы могли бы определить переполнение, когда у вас есть несколько соседних буферов друг за другом, и вы индексируете второй (например, считываете 6-й элемент из первых 3-х -element array, но вы получаете третий элемент второго трехэлементного массива).

Переполнение стека - это своего рода переполнение буфера, когда вы заполняете весь «буфер памяти» стека.

1
ответ дан 5 December 2019 в 04:36
поделиться

В чем разница между переполнением буфера и переполнением буфера? Я бы сказал, что переполнение буфера - это когда вы пытаетесь писать за пределами конца буфера, но у вас есть проверка, которая предотвращает это. буфер переполнения - это когда вы действительно пишете за пределами конца буфера. Первый - это быстро сбой, второй сложнее обнаружить.

Вы не можете переполнить буфер в java, поскольку он всегда имеет проверку границ и, таким образом, создает исключение BufferOverflowException.

В чем разница между переполнением буфера и переполнением стека?

Они не имеют ничего общего друг с другом.

0
ответ дан 5 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: