Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【原创】多线程环境下_tiddata变量申请出现内存泄露

$
0
0
1、在进行病毒试验的过程,我们发现会出现使用CRT技术,如果涉及到了多线程工程,那么必须对工程的属性进行设置,否则,就会在编译阶段出现如下错误提示:
附件 78979

这是因为我们在运行程序的过程中,使用了beginthread函数,这个函数实在多线程环境中使用的函数,如果我们进行如下设置,【project】->【setting】->【C++】->【Code generation】->【Mutiplethread】,这样,程序就能够正常运行了。解释如下:
多线程设置编译环境,这样,当我们程序中使用了涉及到TLS变量的函数操作的时候,就会检查看看程序有没有定义一个_MT的宏,其代码如下部分:
#ifdef _MT
_ptiddata ptd = _getptd();
#else
Static char *nextocken;
#endif
下面,对此给出解释。
多线程运行环境中,如果存在涉及到_tiddata结构体的成员函数操作,那么就需要一个多线程内部全局变量来保证这些函数不出问题。Crt提出的为每一个线程提供一个_tiddata结构体来解决这个问题。这个结构体保存了所有这些函数运行时需要的变量,我们只需要在创建多线程环境是,将这个为线程申请到的变量的首地址存放在线程的tls中,crt技术为了保证能够申请到空间,采用了如果在创建新县城的时候没有申请到_tiddata变量,那么就立即分配堆区变量,从而保证每一个新县城都可以使用并创建一个_tiddata结构体。但是仅仅解决了申请没有解决释放的问题,因此,就会出现打开程序
代码:

#include <WINDOWS.H>

#include <STDIO.H>

DWORD        WINAPI        beginThreadFunc(LPVOID)
{
        char        cBuffer[] = "mm bc,bdm";

        char        *token = strtok(cBuffer," ,");

        while (token != NULL)
        {
                printf("%s\n",token);

                token = strtok(token," ,");
        }
        return 0;
}

int                main(int        argc,char* argv[])
{
        while (1)
        {
                HANDLE        hThread = CreateThread(NULL,0,beginThreadFunc,0,0,0);
                CloseHandle(hThread);
        }
        return 0;
}

我们会发现,打开任务管理器,会发现这个程序的占用内存量飙升,这是因为,系统进行线程创建的时候发现上述程序创建新线程的时候没有给线程分配_tiddata空间,系统就进行分配,但是并没有解决空间释放的问题,因此,不停地在主函数内部创建新线程,不停地申请空间,导致出现内存泄露。

上传的图像
文件类型: png 11.png (7.5 KB)

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>