英特尔检查器 XE 2012 警告 #12367 - 将迭代器参数切片传递给 vector::erase()

Intel Inspector XE 2012 warning #12367 - slicing of iterator parameter passed to vector::erase()

本文关键字:切片 vector erase 参数 迭代器 XE 检查 2012 警告 #12367 英特尔      更新时间:2023-10-16

我收到警告#12367 when running Build | Build Solution for Intel Static Analysis,但我看不到我的代码有问题。有人的想法吗?

警告 #12367:由于隐式类型转换,在调用"std::_Vector_iterator>> std::vector>::erase(std::_Vector_const_iterator>>)"中作为实际参数 2 传递的对象切片

 pragma warning(suppress: 4995)
    #include <vector>
    class __declspec(dllexport) MxPluginLib //nothing special here, not derived class etc
    {
    public:
      // ...
    private:
     //  ... nothing special here
    };

    class __declspec(dllexport) MxPluginManager 
    {
    public:
       //...
    private:
    #pragma warning(suppress: 4251)
        std::vector<MxPluginLib *> _Libs;
    };
    bool MxPluginManager::DeleteNextUnselected()
    {
        bool erased = false;
        size_t cnt = _Libs.size();
        if (cnt > 0 )
        {
            for (size_t x = 0; x < cnt; x++)
            {
                if (_Libs[x]->GetSelection() == false)
                {
                    delete  _Libs[x];
                    _Libs[x] = '';
                    _Libs.erase(_Libs.begin()+x);  //THIS IS WHERE THE WARNING IS GENERATED
                    erased = true;
                    break;
                }
            }
        }
        return erased;
    }

在我看来,唯一奇怪的线是

_Libs[x] = '';

这可能会使分析器认为您正在存储字符而不是指针。由于您无论如何都要擦除该元素,因此您并不真正需要它 - 删除它,看看它是否解决了您的问题。

此行

_Libs.erase(_Libs.begin()+x);

vector::iterator传递给期望vector::const_iterator的函数。这是可以的,并且需要工作(但标准并没有确切说明它是如何工作的,只是iterator可以转换为const_iterator)。

在您的实现中,似乎iterator是从const_iterator派生的,传递参数将通过"切片"派生部分将其转换为基类。

在这种情况下,这不是

错误,可以忽略警告。