发生缓冲区溢出

MH

几天前,出于安全考虑,我公司将操作系统从Windows XP更改为Windows 7(32位)。

我在VS 2008,QT 4.8.1和Boost中使用C ++。我的应用程序中的结构成员对齐是1个字节(/ Zp1)。

更改后,我发现了一个错误:

我加载使用的库QPluginLoader,然后将qobject_cast其强制转换为接口。在我的库中,我可能会加载另一个。

更改操作系统后,当我在调试模式下测试应用程序时,一切正常。一切都按预期进行,然后将其更改为Release,我的应用程序开始崩溃。

当我用VS 2008调试它时,我看到了此错误:

my_app.exe中发生缓冲区溢出,已损坏程序的内部状态。按Break调试程序,或按Continue终止程序。

有关更多详细信息,请参见帮助主题“如何调试缓冲区溢出问题”。

该应用程序在Windows XP(发行和调试模式)上仍然可以正常运行。

一开始,我以为是因为依赖或我错过了某些东西。经过几个小时的测试,并以发布模式登录来跟踪我的应用程序,我终于找到了问题所在。当一种方法试图将值(任何值)返回给在库中调用它的另一个方法时,我的应用程序崩溃。

例如:

方法B返回Bool,我在方法A中调用它。当方法B完成并准备将Bool值返回给方法A时,应用程序崩溃。如果要返回加载库的方法(如果该方法返回值),也会崩溃。不知何故,可以使用不返回任何值(无效)的方法。

为了确定到底出了什么问题,我在方法中的代码创建了另一个应用程序(测试器),并开始逐部分添加代码以查找错误。我相信这与QT有关。

请检查以下代码,并告诉我您是否知道错误所在。

我有main.cpp加载这样的插件:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString filename = "correct path";

    QPluginLoader* pluginLoader = new QPluginLoader(filename);

    QObject *plugin = pluginLoader->instance();

    PluginInterface* plugin_instance;

    if (plugin) 
    {
        
        SecureZeroMemory(&plugin_instance, sizeof(PluginInterface));

        plugin_instance = qobject_cast<PluginInterface *>(plugin);

    }

    bool result = plugin_instance->initialize();

    return a.exec();
}

这是我的界面:

class PluginInterface
{
public:

    virtual bool initialize() = 0;
};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(PluginInterface,"some text");
QT_END_NAMESPACE

我使我的图书馆像这样:

plugin.hpp

class Plugin : public QObject, public PluginInterface
{
    Q_OBJECT
    Q_INTERFACES(PluginInterface)

public:
    Plugin();
    bool initialize();  
};

plugin.cpp

#define SUPPORTED_VERSIONS  0x01011403
#define WFS_TRACE_NONE      0

bool Plugin::initialize()
{
    WFSVERSION wfs_version;
    HRESULT hRes;

    cout << "WFSStartUp" << endl;

    hRes = WFSStartUp(SUPPORTED_VERSIONS, &wfs_version);

    WORD version = wfs_version.wVersion;

    cout << "version : " << version << endl;

    DWORD dwTrace = WFS_TRACE_NONE;

    cout << "WFSCreateAppHandle" << endl;

    HRESULT hRes2;
    HANDLE app_handle;
    hRes2 = WFSCreateAppHandle(&app_handle);

    cout << "Result : " << hRes2 << endl;

    return true;
}
Q_EXPORT_PLUGIN2(my_plugin, Plugin);

这是我的测试器应用程序的输出:

WFSStartUp
版本:63424
WFSCreateAppHandle
结果:0
应用程序崩溃!

里面的代码Plugin::initialize()工作正常。我将其复制/粘贴到main()并运行该应用程序以确保对其进行确定。

怎么了 我想念什么?

MH

我不得不更改一些Visual Studio构建选项来解决此问题!

  • 优化=自定义(配置属性-> C / C ++->优化)
  • 内联函数扩展=默认(配置属性-> C / C ++->优化)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章