Где частные переменные живут в стеке в C ++ - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь переполнить буфер в C ++, который является частной переменной.Где он живет в стеке?Возможно ли это?

Что-то вроде

class aClass{
private:
  char buffer[SIZE];
public:
}

Ответы [ 6 ]

4 голосов
/ 10 марта 2011

Публичные и приватные переменные не рассматриваются по-разному с точки зрения макета. Класс, выделенный в стеке, имеет свои внутренние элементы данных, выделенные в стеке, независимо от того, являются ли они частными или общедоступными.

class MyClass {
public:
    int PublicInt;
private:
    int PrivateInt;
};

int main() {
    MyClass instance;
}

эквивалентно, в терминах памяти

int main() {
    int a, b;
};
2 голосов
/ 10 марта 2011

Э-э ... Ваш вопрос звучит как "Какого цвета голубое небо?".И ответ, по-видимому, «синий».

Когда переменная размещается «в стеке», она живет в стеке .Более подробного объяснения этому нет.«В стеке» - это ответ «где?»вопрос.Память стека однородна.Нет более подробного «где», чем простое и простое «в стеке».

Тот факт, что ваш массив является частным членом класса, не имеет никакого значения.Весь массив является неотъемлемой частью объекта.Если вы определите объект вашего типа класса как локальный объект («в стеке»), то весь массив будет жить в стеке, независимо от того, является ли он закрытым или нет.

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

2 голосов
/ 10 марта 2011

Да, возможно, переменная размещается в стеке в непрерывном порядке, как и остальные члены этого объекта; более того, в C ++ данные всегда будут доступны для механизмов более низкого уровня. Частная / публичная парадигма - это просто защита, разработанная для предотвращения случайного доступа во время компиляции, но это никоим образом не означает, что доступ к этим данным невозможен.

Однако проблема, с которой вы столкнетесь, заключается в том, что « Порядок распределения нестатических элементов, разделенных спецификатором доступа, не указан ». согласно п. 9.2 п. 12 стандарта. См. этот пост для получения дополнительной информации.

При этом, если вы написали код, о котором говорите (и, следовательно, у вас есть возможность его изменить), я бы настоятельно рекомендовал изменить ваш дизайн, чтобы вам не пришлось это делать. В C ++ есть ключевое слово, которое называется « friend » или « friend class », которое вы можете найти.

Или ... вы можете обмануть, как подсказывает этот плакат.

1 голос
/ 10 марта 2011

Вот простая программа, которая может повредить стек; фактически он вызывает неопределенное поведение или поведение, зависящее от платформы :

void function_destroyer(int a, double b, char c)
{
  unsigned char array[1];
  for (int i = 0; i < 32; ++i)
  {
    array[1 - i] = 0x24; // A value chosen at random
  }
  return;
}

int main(void)
{
  function_destroyer(1, 1.5. 'f');
  return EXIT_FAILURE;
}

Стек может быть поврежден при доступе к элементам перед первым элементом в массиве.Это зависит от компилятора, генерирующего стек и передающего переменные в стеке.

0 голосов
/ 10 марта 2011

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

 void aClass:: bufferOverflow() // Assuming this a member of aClass
 {
      for( int i=0; i<(SIZE+2), ++i )
          buffer[i] = 'a'; // Writing past the 2 locations.
 }

Где он находится в стеке?

Stack it self - место хранения. Что вы подразумеваете под тем, где он находится в стеке.

0 голосов
/ 10 марта 2011

Попробуйте следующее:

#include <string.h>

void foo (char *bar)
{
   char  c[12];

   strcpy(c, bar);  // no bounds checking...
}

int main (int argc, char **argv)
{
   foo(argv[1]); 
}
...