【问题标题】:C26486 - Don't pass a pointer that may be invalid to a function?C26486 - 不要将可能无效的指针传递给函数?
【发布时间】:2019-11-18 23:20:37
【问题描述】:

我正在为 Windows 开发内核驱动程序,最近我决定从 C 过渡到 C/C++。在我的代码转换过程中,我遇到了一个我无法解决的警告。基本上,我有一个带有这行特定代码的函数:

OB_PREOP_CALLBACK_STATUS
OCPreOperationCallback(
    _In_ PVOID RegistrationContext,
    _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation
    )
{
    // ...
    auto test = IoThreadToProcess(static_cast<PETHREAD>(OperationInformation->Object));
    // ...
}

此行突出显示错误消息如下:

警告 C26486 不要将可能无效的指针传递给函数。对“IoThreadToProcess”的调用中的参数 0“(*OperationInformation).Object”可能无效 (lifetime.3)。

警告似乎很清楚:我需要确保作为参数传递的指针是有效的。然而,我找不到任何方法来检查无效状态。我尝试添加:

if(OperationInformation != nullptr && OperationInformation->Object != nullptr)

在分配之前,但警告仍然存在。

我是否错过了有关此问题的某些内容?

【问题讨论】:

  • 对此不熟悉,但是当您检查 static_cast&lt;PETHREAD&gt; 结果是否为空时会发生什么?
  • 似乎较新的 Visual Studio 版本中的静态分析变得过于激进;最近有很多关于误报的问题。我怀疑这可能是其中之一。

标签: c++ pointers compiler-warnings


【解决方案1】:
PETHREAD pThread = static_cast<PETHREAD>(OperationInformation->Object);
if(pThread != nullptr) //or 'pThread != NULL' or 'pThread'
{
   auto test = IoThreadToProcess(pThread);
}

【讨论】:

  • 您好!感谢您的回答。不幸的是,您的示例似乎仍然发出警告:imgur.com/6NOGwWD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多