Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向调用方SAL错误的指针的输出_C++_C_Pointers_Sal - Fatal编程技术网

C++ 指向调用方SAL错误的指针的输出

C++ 指向调用方SAL错误的指针的输出,c++,c,pointers,sal,C++,C,Pointers,Sal,我正在尝试添加到我的代码。。。我根据msdn工作,在msdn示例中发现了错误,不知道如何处理 在这里,litle将示例“指向调用者的指针的输出(示例:Outptr注释)”从 Outptr用于注释用于返回 指针。参数本身不应为NULL,并且调用 函数返回其中的非空指针,该指针指向 初始化数据 我的代码: #include "stdafx.h" #include "assert.h" void GoodOutPtrCallee(_Outptr_ int **pInt) { int *pIn

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

在这里,litle将示例“指向调用者的指针的输出(示例:Outptr注释)”从

Outptr用于注释用于返回 指针。参数本身不应为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;
}
如果我在VS2013中编译它,并启用代码alalysys,我会

为了

if (*pInt != NULL)
划船

我的注释中出现了什么问题以及如何修复它?

编辑:我被类似的变量名、
pInt
pInt2
弄糊涂了。
您可能应该将
pInt
标记为输入和输出,而不仅仅是输出,因为您正在读取它的值,以检查它是否为
NULL

,因为您正在读取通过指针参数
pInt
传递的值,因此无法使用
\u Outptr\u
,因为这描述了一个仅用作输出而不用作输入的参数。改用
\u输入\输出


你可能想重新考虑使用SAL。它的文档记录非常糟糕,因此我不能肯定地说,
\u Inout\u
实际上是这里使用的最佳注释。我所能确定的是,根据微软的模糊描述,这是我能找到的最好的匹配,而且它消除了警告。当然,这样做不会使用注释。

如果您希望这样的错误代码通过分析,那么您必须删除SAL注释。当然,这不是你的意图。@HansPassant,这是一段演示代码,用来发现SAL是如何工作的。。。不理想。。但这种方法有什么不好呢?SAL并没有很好的记录。我找到了与我的函数原型相匹配的VC++头,并查看它是如何注释的。到目前为止,我无法收集这样的函数(
int**
)。我只想说编译器告诉我们,
pInt
所指向的内容正在被读取,尽管
pInt
被注释为“only”返回某个内容,这意味着它只是在编写。Kirill,我正在检查指针上的指针是指向值还是空。请查看我的更新代码。注释基本正确。代码肯定是正确的。哦,我明白了,是我的错。看起来注释
\u Outptr\u
是不够的:如果
pInt
仅用作输出(如注释所述),那么为什么要将其作为输入(通过检查
NULL
的值)?