【问题标题】:Output of pointer to caller SAL error指向调用者 SAL 错误的指针的输出
【发布时间】:2014-10-31 16:14:39
【问题描述】:

我正在尝试将SAL添加到我的代码中...我根据msdn工作并在msdn示例中发现了错误,不知道如何处理。

这里很少更改示例“指向调用者的指针的输出(示例:Outptr 注释)”来自Understanding SAL

Outptr 用于注释要返回的参数 指针。参数本身不应为 NULL,并且被调用 函数在其中返回一个非 NULL 指针,该指针指向 初始化数据。

我的代码:

#include "stdafx.h"
#include "assert.h"

void GoodOutPtrCallee(_Outptr_ int **pInt)
{
    int *pInt2 = new int;

    if (*pInt != NULL)
    {
        *pInt2 = 1;
    }
    else
    {
        *pInt2 = 2;
    }

    *pInt = pInt2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int* nullValue = NULL;
    GoodOutPtrCallee(&nullValue); 
    assert(*nullValue == 2);

    int someValue = 22;
    int* someValuePtr = &someValue;
    GoodOutPtrCallee(&someValuePtr); 
    assert(*someValuePtr == 1);

    return 0;
}

如果我在启用代码 alalysys 的 VS2013 中编译它,我得到C6001: using uninitialized memory

if (*pInt != NULL)

行。

我的注释中出现了什么问题,我该如何解决?

【问题讨论】:

  • 如果您希望这样的错误代码通过分析,那么您必须删除 SAL 注释。这当然不是你的本意。
  • @HansPassant 是用于查找 SAL 工作原理的演示代码......并不理想......但是这种方法有什么不好?
  • SAL 没有很好的文档记录。我找到了与我的函数原型匹配的 VC++ 标头,并查看它是如何注释的。截至目前,我无法收集此类功能(int**)。
  • 我只想说编译器告诉我们pInt 指向的内容正在被读取,尽管pInt 被注释为“仅”返回某些内容,这意味着它只是被写入。

标签: c++ c pointers sal


【解决方案1】:

由于您正在读取通过指针参数 pInt 传递的值,因此您不能使用 _Outptr_ ,因为它描述了一个仅用作输出而非输入的参数。请改用_Inout_

您可能需要重新考虑使用 SAL。它的文档记录很差,因此我不能肯定地说_Inout_ 实际上是这里使用的最佳注释。我所知道的是,根据微软模糊的描述,这是我能找到的最佳匹配,并且它消除了警告。当然不会使用注解。

【讨论】:

    【解决方案2】:

    编辑:我对类似的变量名称感到困惑,pIntpInt2。 您可能应该将pInt 标记为输入和输出,而不仅仅是输出,因为您正在读取它的值来检查它是否是NULL

    【讨论】:

    • Kirill,我正在尝试检查指针上的指针是指向值还是空值。请查看我更新的代码。
    • 注释大部分是正确的。代码肯定是正确的。
    • 哦,我明白了,我的错。看起来注释_Outptr_ 是不够的:如果pInt 仅用作输出(如注释所述),那么为什么要将它作为输入(通过检查NULL 的值)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2021-09-23
    • 2013-04-14
    相关资源
    最近更新 更多