0

我有以下示例代码,想知道我可以使用什么样的注释来避免它们。

int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }

   return pInput->value;
}

问题是,由于 Prefast 只评估它不知道Create初始化指针的函数。

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

我想知道__analysis_assume代码中的任何地方是否有一个很好的替代方法,以便 prefast 从函数定义中提取它。

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

4

2 回答 2

2

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

但是,我只是建议您重写当前的代码……

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++ 级别的类型的更加关注。这里类型的首字母大写,纯函数首字母小写。

它更简单、更安全、更高效。

而且 – 在 C++ 级别,您通常不必为愚蠢的 SAL 表示法而苦恼。:-)

干杯&hth.,

于 2011-09-20T21:39:17.770 回答
1

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

于 2011-09-20T19:22:57.100 回答