2011-03-10 30 views
1

我用C/C++编写代码。破坏存储在数据段中的静态变量有哪些可能的方法?这是否被认为是内存泄漏?我该如何破坏一个linux进程的数据段?

#include <stdio.h> 

int aaa[5]; 
int bbb; 
int main() 
{ 
     int i; 
     bbb=41; 
     for (i = 0; i < 6; ++i) 
       aaa[i] = 42; 
     printf("%d\n", bbb); 
     return 0; 
} 

上面的代码打印bbb = 42而不是41,这是一个可能的原因。另一种方法是修改通过多个线程访问的静态数据 。

还有其他方法吗?

+2

C或C++?两者都是完全不同的语言。 –

+0

它是C++。不是C – cateof

回答

1

是的,有破坏全球变量的内容(你的变量是不是在您发布的例子静态)一种以上的方法。

指针是一种很好的工具,可以破坏内存并编写程序不应该写的地方。铸造还可以添加一些兴奋:

#include <iostream> 
using namespace std; 

int aaa[5]; 
int bbb; 

int main(void) // Do *your* main() functions always return a value???? 
{ 
    double * ptr_double = 0; 
    // Assign the pointer to double to point to the last integer. 
    // Treat the last integer in the array as a double. 
    aaa[4] = 45; 
    cout << "aaa[4] = " << aaa[4] << endl; 

    ptr_double = (double *)(&aaa[4]); 
    *ptr_double = 3.14159267; 
    cout << "aaa[4] = " << aaa[4] << endl; 

    return -1; 
} 

多线程,可以让每个线程写入全局变量,然后让他们读回值。在写作之前和写作之后放置随机延迟可以更详细地向你展示它是如何工作的。

另一种方法是将变量的地址分配给I/O硬件设备的目标寄存器,如UART。当UART接收到数据时,它将把该数据放入该变量中,而不考虑变量的用途。

一般来说,值写入到它不应该的位置的代码会被破坏。主要原因是缓冲区溢出:写入比分配给变量更多的数据。硬件设备(如DMA控制器和USB控制器)也可能发生超限。另一个原因是通过指针:指针指向一个无效的位置。

变量可能会被堆栈溢出和堆溢出损坏。在许多体系结构中,这些结构向对方扩展。堆栈上太多变量或函数递归(或调用深度)可能会使堆栈覆盖到堆中。同样,从堆中分配太多内存可以使堆覆盖堆栈。

与其研究如何破坏变量,我相信你应该努力提高代码安全性:设计并编写代码,使其没有缓冲区溢出,写入正确的位置和共享变量受到多任务同时写入的保护,线程。

4

不,这不是内存泄漏。内存泄漏是当您在免费商店(与malloc/new)分配,然后从未free/delete分配的块。

2

注意,这是不确定的行为,并且不保证:

int bbb; 
int aaa[5]; 
int main() 
{ 
    int i; 
    bbb=41; 
    for (i = 0; i < 6; ++i) 
      aaa[i] = 42; 
    printf("%d\n", bbb); 
    return 0; 
} 
g++ -o test test.cpp && ./test 
41 

在这种特殊情况下BBB存储AAA后,但你不应该靠这个根本的原因也可能是别的地方。

+0

有没有其他方法来破坏静态全局变量? – cateof

+0

有没有保证静态全局变量的方法。如果你正在尝试的是对已有代码进行一些破解,我会尝试自己注册一个静态变量,并在静态变量内存地址的上下写入一些垃圾字节。 –

+0

是否有可能在堆栈或堆中的错误损坏.data? – cateof

1

在执行过程中的任何代码之前,所有全局变量(静态或其他)都将被初始化为在其声明中指定的值(如果未指定,则为零)。默认值只能通过进程内执行的代码修改(禁止调试器的任何外部干扰)。

如果您在程序的main()函数的开头看到“损坏”的值,很可能是由于在全局C++对象的构造函数中执行了错误的操作。所有全局C++对象的构造函数在调用main()之前运行。

追踪这类腐败来源的最简单方法可能是在调试器下运行该过程,并在全局变量的地址上设置一个观察点。数据修改时,调试器将中断。几率是你有一个数组溢出或错误的指针问题。他们可能是一个婊子手动追踪。

1

这是一个典型的编程错误。 您使用6个aaa来定义aaa数组的5个项目,这意味着您只能使用aaa [0],aaa [1],aaa [2],aaa [3]和aaa [4]。 aaa [5]是未定义的。 这是一个错误,一个编程错误,没有别的。期。