首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prefast中NULL引用的注释与编译--兼论GCC

Prefast中NULL引用的注释与编译--兼论GCC
EN

Stack Overflow用户
提问于 2011-09-21 01:32:34
回答 2查看 587关注 0票数 0

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

代码语言:javascript
复制
int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }

   return pInput->value;
}

问题是,因为Prefast只计算函数的值,所以它不知道Create初始化了指针。

我本以为可以通过在classA::Create的头文件中使用__out注释来解决这个问题,但是这并不起作用。

我想知道是否有一个很好的替代方法,可以在代码中到处使用__analysis_assume,这样prefast就可以从函数定义中提取它。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-21 05:39:18

MSalter’s answer听起来非常像正确的技术答案。幸运的是,我不认识SAL,所以我不能肯定,但它看起来像是技术级别的解决方案。

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

代码语言:javascript
复制
int Function(classA* pInput) {
   if (pInput == NULL) {
      classA::Create(pInput);
   }

   return pInput->value;
}

作为…

代码语言:javascript
复制
int Function( classA* pInput ) {
   if (pInput == NULL) {
      pInput = classA::Create();
   }

   return pInput->value;
}

这里的主要问题是你是否正在一个动态创建的对象,或者不是。这在很大程度上取决于Create方法的作用。但看起来你确实漏水了。

在这种情况下,Create除了动态分配一个默认初始化的classA对象外,什么也不做,那么下面是如何更安全、更有效地执行此操作:

代码语言:javascript
复制
int Function( classA* pInput ) {
   if (pInput == NULL) {
      return classA().value;
   }

   return pInput->value;
}

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

代码语言:javascript
复制
int function( ClassA const& anObject = ClassA() )
{
   return anObject.value;
}

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

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

而且-在C++级别,你通常不需要纠结于愚蠢的SAL符号。:-)

干杯&哈。

票数 2
EN

Stack Overflow用户

发布于 2011-09-21 03:22:57

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7489255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档