意外的 C26117 使用 scoped_lock

Unexpected C26117 using scoped_lock

提问人:kassio 提问时间:11/16/2023 更新时间:11/16/2023 访问量:38

问:

出于某种原因,我在我的一个函数中使用 scoped_lock 收到 Intellisense 警告 C26117。 我不明白为什么

bool CastleManager::loopCastleBuffs(CPlayer* player, std::function<bool(CastlePackBuff)> func)
{
    if (player)
    {
        std::scoped_lock _lock(this->CastlesData._mutex, this->Packs._mutex);

        auto guild = g_NGuildManager->_FindGuild(player->m_ID.m_nID);

        if (this->CastlesData.find(guild->m_guild.nMaster) != this->CastlesData.end())
        {
            auto castledata = this->CastlesData[guild->m_guild.nMaster];

            for (auto [id, level] : castledata->packs)
            {

                auto pack = this->Packs[id];
                if (level <= 0 || level > pack->Levels.size())
                    continue;

                auto buffs = &pack->Levels.at(level - 1)->Buffs;

                for (int i = 0; i < buffs->size(); i++)
                {
                    if (func(buffs->at(i)))
                        return true;
                }
            }
        }

    }
    return false; // C26117 WARNING HERE
}

最奇怪的是,当我编译时,警告没有出现在输出中,它只是用绿色下划线来标记这一行,并在我将鼠标悬停在它上面时显示警告

enter image description here

我的 Visual Studio 是葡萄牙语,但警告的英文翻译是:

C26117: Releasing unheld lock '_lock.$lock01' in function 'CastleManager::loopCastleBuffs'.
C26117: Releasing unheld lock 'this->CastlesData._mutex' in function 'CastleManager::loopCastleBuffs'.
C26117: Releasing unheld lock 'this->Packs._mutex' in function 'CastleManager::loopCastleBuffs'.

我已经尝试过lock_guard并得到了相同的结果。 这显然不会在运行时产生任何错误,我想知道它是否只是一个 Visual Studio 错误,我可以放心,或者我是否做错了什么并且应该修复它。

C++ 互斥锁

评论

0赞 273K 11/16/2023
为什么不制作和减少压痕深度?if (!player) return false;if (this->CastlesData.find(guild->m_guild.nMaster) == this->CastlesData.end()) return false;
1赞 molbdnilo 11/16/2023
看起来像静态分析的误报。
0赞 Pepijn Kramer 11/16/2023
智能感知并不总是正确的。我希望你的代码的实际编译不会给你同样的警告。我看不出您的代码有什么问题,并且确实验证了这一点,编写一个调用此函数的单元测试来检查运行时行为。

答: 暂无答案