我正在尝试在C ++中溢出一个私有变量的缓冲区。它在哪里生活?这可能吗?
像
这样的东西class aClass{
private:
char buffer[SIZE];
public:
}
答案 0 :(得分:4)
在布局方面,公共和私有变量的处理方式不同。在堆栈上分配的类具有在堆栈上分配的内部数据成员 - 无论是私有还是公共。
class MyClass {
public:
int PublicInt;
private:
int PrivateInt;
};
int main() {
MyClass instance;
}
在内存中相当于
int main() {
int a, b;
};
答案 1 :(得分:2)
是的,可能的是,变量以与该对象的其余成员相邻的顺序排列在堆栈上;而且,在C ++中,数据本身总是可以通过较低级别的机制访问。私有/公共范例只是一种旨在防止在编译时意外访问的保护,但绝不意味着无法访问该数据。
然而,您将面临的问题是“由访问说明符分隔的非静态成员的分配顺序未指定。”根据标准第9.2条第12节。有关详细信息,请参阅this帖子。
话虽这么说,如果你编写了你正在谈论的代码(因此你有能力修改它),我强烈建议改变你的设计,这样你就不必这样做了。 C ++中有一个名为“朋友”或“朋友类”的关键字,您可能需要查找。
或者......你可以作弊,正如this海报所说的那样。
答案 2 :(得分:2)
呃......你的问题听起来像“蓝天是什么颜色的?”。答案显然是“蓝色”。
当一个变量“在堆栈上”分配时,它将放在堆栈上。没有更详细的解释。 “在堆栈上”是“哪里?”的答案。题。堆栈内存是统一的。没有更详细的“在哪里”而不是简单的“在堆栈上”。
您的数组是该类的私有成员的事实没有任何区别。整个数组是对象的组成部分。如果将类类型的对象定义为本地对象(“在堆栈上”),那么整个数组将存在于堆栈中,无论它是否为私有。
如果这不能回答你的问题,十,你必须以更有意义的方式重新陈述。
答案 3 :(得分:1)
这是一个可能破坏堆栈的简单程序; 它实际上产生了与平台相关的未定义行为或行为:
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;
}
通过访问数组中第一个元素之前的元素,可能会损坏堆栈。这取决于编译器生成堆栈并在堆栈上传递变量。
答案 4 :(得分:0)
尝试以下方法:
#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]);
}
答案 5 :(得分:0)
写过数组可以看作是缓冲区溢出的一个例子。你可以做到这一点,但我不知道你想要通过这样做来实现。
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.
}
它在堆栈中的哪个位置?
自动堆叠是一个存储位置。它是什么意思,它存在于堆栈中。