我有以下示例代码,我想知道我可以使用哪种类型的注释来避免它们。
int Function(classA* pInput) {
if (pInput == NULL) {
classA::Create(pInput);
}
return pInput->value;
}问题是,因为Prefast只计算函数的值,所以它不知道Create初始化了指针。
我本以为可以通过在classA::Create的头文件中使用__out注释来解决这个问题,但是这并不起作用。
我想知道是否有一个很好的替代方法,可以在代码中到处使用__analysis_assume,这样prefast就可以从函数定义中提取它。
其次,我想知道如何设置我的构建配置,这样我就可以在Linux上本地构建我的代码,或者使用这些预处理器指令使用GCC构建我的代码。我是否必须检查它是否在LINUX版本上,然后将这些注释作为空宏添加?
发布于 2011-09-21 05:39:18
MSalter’s answer听起来非常像正确的技术答案。幸运的是,我不认识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符号。:-)
干杯&哈。
发布于 2011-09-21 03:22:57
SA似乎缺少classA::Create(classA*)的classA*&参数上的[Post( Null=No )]
https://stackoverflow.com/questions/7489255
复制相似问题