在Prefast和GCC编译中NULL解引用的注解

Annotations for NULL Dereference in Prefast and Compiling on GCC

本文关键字:引用 NULL Prefast GCC 编译      更新时间:2023-10-16

我有以下示例代码,想知道我可以使用哪种注释来避免它们。

int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }
   return pInput->value;
}

问题是,由于Prefast只计算函数,它不知道Create初始化了指针。

我想我可以通过在classA::Create的头文件中使用__out注释来解决它,但是这不起作用。

我想知道在代码中是否有一个很好的替代__analysis_assume,以便快速从函数定义中拾取它。

其次,我想知道如何设置我的构建配置,以便我可以用这些预处理器指令在Linux或GCC上本地构建我的代码。我是否需要检查它是否在LINUX上构建,然后将这些注释添加为空宏?

salter的回答听起来很像正确的技术答案。幸运的是,我不知道SAL,所以我不能肯定地说,但它看起来像技术层面的解决方案。

然而,我只是建议你重写你当前的代码& help;

int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }
   return pInput->value;
}

白马王子;

int Function( classA* pInput ) {
   if (pInput == NULL) {
      pInput = classA::Create();
   }
   return pInput->value;
}
这里的主要问题是您是否泄漏动态创建的对象。这在很大程度上取决于Create方法的作用。但是看起来你确实在漏水。

在这种情况下,Create什么也不做,只是动态分配一个默认初始化的classA对象,那么这里是如何更安全地做到更有效:

int Function( classA* pInput ) {
   if (pInput == NULL) {
      return classA().value;
   }
   return pInput->value;
}

最后,考虑如何清除不必要的原始指针。因为原始指针会产生问题(您的代码只是一个非常小的例子)。然后你可以这样做:

int function( ClassA const& anObject = ClassA() )
{
   return anObject.value;
}

本质上这是一个c++级别的解决方案,与原始代码的C级别相反。因此,我还更改了命名约定,以反映c++级别对类型的更强关注。这里类型的首字母为大写,而函数的首字母为小写。

更简单,更安全,更高效。

mdash;在c++级别,您通常不必与愚蠢的SAL符号作斗争。: -)

干杯,hth。

似乎SA在classA::Create(classA*)classA*&参数上缺少[Post( Null=No )]