在Prefast和GCC编译中NULL解引用的注解
Annotations for NULL Dereference in Prefast and Compiling on GCC
我有以下示例代码,想知道我可以使用哪种注释来避免它们。
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 )]
相关文章:
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何在C++中返回Null作为引用
- 如何引用 obj1 并在 NULL 时调用 show 方法
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 如果 null 不是有效值,则使参数成为引用而不是指针
- 我可以根据null或特定类型的值检查引用吗
- 指针引用const null值
- 引用绑定到类型 'struct value_type' 的 null 指针
- 为什么我们需要在move构造函数中将右值引用设置为null
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- 引用地址如何在C++变为 NULL
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- IID_PPV_ARGS和取消引用NULL
- 通过解引用NULL指针来赋值引用
- 取消引用 NULL 指针是否保证在 C/C++ 中使程序崩溃
- 在c++中解引用NULL指针
- clang++ 4.1,在解引用NULL时没有崩溃