none
vs2008程序再win7上运行出现无法解释的问题 RRS feed

  • 问题

  •       公司最近将工作的电脑系统从xp换成了win7,新开发了一个程序,出现了很诡异的情况,程序不管是编译运行还是独立运行,偶尔会出现启动就出错。调试发现在调用_DllMainCRTStartup中调用__security_init_cookie出现错误。在代码没修改的情况下重新编译一下又正常了,过段时间又这样。有时还不需要编译,只需要把执行文件拷贝到其他目录也能运行,真是无语。

    void __cdecl __security_init_cookie(void)
    {
        UINT_PTR cookie;
        FT systime={0};
        LARGE_INTEGER perfctr;

        /*
         * Do nothing if the global cookie has already been initialized.  On x86,
         * reinitialize the cookie if it has been previously initialized to a
         * value with the high word 0x0000.  Some versions of Windows will init
         * the cookie in the loader, but using an older mechanism which forced the
         * high word to zero.
         */

        if (__security_cookie != DEFAULT_SECURITY_COOKIE
    #if defined (_X86_)
            && (__security_cookie & 0xFFFF0000) != 0  //调试错误断点就再这里,高手们是啥原因
    #endif  /* defined (_X86_) */


           )
        {
            __security_cookie_complement = ~__security_cookie;
            return;
        }

    }

    2017年2月27日 16:05

全部回复

  • Hi xkm611217,

    感谢在MSDN论坛发帖。

    >>公司最近将工作的电脑系统从xp换成了win7,新开发了一个程序,出现了很诡异的情况,程序不管是编译运行还是独立运行,偶尔会出现启动就出错。调试发现在调用_DllMainCRTStartup中调用__security_init_cookie出现错误。在代码没修改的情况下重新编译一下又正常了,过段时间又这样。有时还不需要编译,只需要把执行文件拷贝到其他目录也能运行,真是无语。

    请测试一下建立一个新的c++工程,不做任何处理,查看是否可以正确编译运行。

    你出现该问题可能是因为你的代码中有缓冲区溢出的安全隐患。对于编译器识别为受缓冲区溢出问题影响的函数,编译器在返回地址之前在堆栈上分配空间。 在函数入口,分配的空间加载一个在模块加载时计算一次的安全cookie。 在函数退出时,调用一个帮助函数以确保cookie的值仍然相同。 不同的值表示可能发生了堆栈的重写。 如果检测到不同的值,则终止处理。

    你也可以将project Properties->C/C++->Code Generation->Buffer Security Check设置为Disable Security Check (/GS-).

    这里有篇文档你可以参考一下。

    https://msdn.microsoft.com/en-us/library/8dbf701c.aspx

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年2月28日 6:41
  • 你好 谢谢你的回复 现在的情况是不管是用vs启动的程序还是鼠标双击EXE运行都这样 而且还不是一台win7电脑是这样  程序都是vs2008编译的 你说的这个编译项对不用vs运行的程序没用吧 程序我调试运行很久后关闭程序没有一点内存泄漏 再xp系统上运行一点问题没有 我也是醉了 有啥办法能找到出错源吗
    2017年2月28日 11:29
  • 是不是您的DLL库 DllMain()入口函数中调用了什么不安全的代码导致的?
    DllMain有些特殊,有些操作是不允许的,详细请参考MSDN文档。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2017年3月1日 12:23
    版主
  • 问题是断点在DllMain之前呀根本还没有进入我写的DLL的DllMain中,Disable Security Check (/GS-).也试过,也出问题,断点不在__security_init_cookie了 而在CRT初始化的时候了,但这样的程序再xp上一点问题没有 是不是系统又BUG
    2017年3月2日 13:30
  • Hi xkm611217,

    >>问题是断点在DllMain之前呀根本还没有进入我写的DLL的DllMain中,Disable Security Check (/GS-).也试过,也出问题,断点不在__security_init_cookie了 而在CRT初始化的时候了,但这样的程序再xp上一点问题没有 是不是系统又BUG

    请查看一下你的代码除了DllMain外,是不是在你的Property Pages->Linker->Advanced->Entry Point 属性里还指定了其他的入口函数。

    或者你可以尝试关闭Property Pages->General->Common Language Runtime Support。

    这里有篇文档,关于Run-Time Library Behavior, 你可以参考下。

    https://msdn.microsoft.com/en-us/library/988ye33t.aspx

    你也可以将这个问题提到Connect上记录一下。

    希望对你有所帮助。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月7日 7:19