繁体   English   中英

无效的指针处理策略

Invalid pointer handling policy

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我认为,如果在函数中传递了空指针,只需将其设为gp,我们就可以轻松找到根本原因。 但是我的队友说,我们应该避免在生产代码中使用gp时间,如果应用程序通常崩溃,客户端可能会感到不安,尽管根本原因可能包含在某些空指针保护中。

需要验证指针为空时将使用哪种方法?

HRESULT function(const int* pNumber)
{
    { POINTER CHECK for pNumber... }
    ...
}

方法1-忽略无效的情况

if(pNumber)
{
    int a = *pNumber;   
}   
  • 没有GP
  • 可能进入异常流
  • 难以找到根本原因

方法2-断言指针,在调试模式下发出警告

assert(pNumber);
int a = *pNumber;
  • 可能GP处于发布模式
  • 切勿进入异常流量
  • 容易找到根本原因

方法3-留下调试消息并返回错误代码

if(!pNumber)
{
    OutputDebugString(L"Error Null pointer in function.\n");
    return E_POINTER;
}
  • 没有GP
  • 切勿在功能内部进入异常流动。 如果客户忽略返回的E_POINTER,则可能进入异常流外部
  • 很难找到根本原因

方法4-引发logic_error异常-让调用者捕获

if(!pNumber)
{
    throw std::logic_error("Null pointer of pNumber in function");
};
  • 没有GP
  • 堆栈展开时,如果没有资源管理(RAII),代码序列中可能发生资源泄漏。
  • 切勿进入异常流量
  • 很难找到引发异常的地方
3 个回复

如果取消引用nullptr ,则输入未定义行为的域。 这意味着,您的编译器没有义务做任何明智的事情 ,因此应避免这样做。 由于它是非法的,因此它可能还会判定它从未发生,因此它将删除相应的代码(并由此对其进行优化),并且您在遇到逻辑错误时不会遇到一般性的保护错误。

我个人更喜欢assert -case,如果nullptr绝对是无效的,但是在那种情况下,引用可能更明智。 我认为没有通用的政策,因为它在很大程度上取决于周围的逻辑。

例外是对合同的严重违反,如果您有两个通过接口进行通信的模块,则这是有意义的。 对于cpp单元本地的静态函数来说,抛出它并不需要太多。 考虑在结束时访问数组。 它还假定另一方会抓住它。

其他任何一个人都不够好。

  • assert(pNumber); 孤独是弱者。 可能存在特定于释放模式的行为,您不会发现它。 此外,它仅限于您在调试中测试过的输入范围(相差甚远)。
  • 忽略无效情况,如上所示,是像鸵鸟一样将头部插入地面。
  • OutputDebugString比断言弱。 您最终将使开发人员随错误消息一起滑动,您将习惯于如此之多,您将停止阅读它们。

因此,如果我不使用异常,我将使用

assert(pNumber);
if(pNumber)
{

}
else
{
   //Log with a logger which has different logging level to the level you seem fit 
}

我方法2

assert(pNumber);
int a = *pNumber;

因为,在调试模式下,您可以轻松确定断言失败发生的位置。 即使在释放模式下,也可以确保null值不会继续进入内部函数。 用户不会看到任何异常行为,应用程序将正常运行。

1 政策包含无效的 JSON 政策

我在运行 terraform apply 时收到此错误消息“Policy contains an invalid JSON policy”,但是当我执行 terraform validate 策略已验证时。我不知道做错了什么。请帮忙。 政策 = <<EOF } ...

2 库中的异常处理策略

构建.NET库时,您的异常处理策略是什么? 具体来说,您在处理库调用中的异常并将它们暴露给调用代码的策略是什么? 例如, 您是否将库函数视为任何其他函数,从而让它无法处理的所有异常都按原样流出? 你会为该库创建一个自定义例外吗? 你会捕获所有异常并抛出库的异常吗 ...

3 指针无效?

我最近学到了指针,并且一直在努力去理解它们。 但是,我遇到了麻烦。 对于类,我们必须编写一个将数组加倍x次的函数。 我能够在没有任何实际问题的情况下编写该函数,但我正在尝试将其实现为实际代码,并且我继续得到无效的指针错误。 这是代码: 那究竟是什么导致了这个问题,我该如何解决呢? ...

4 政策资源无效

我收到错误消息,政策资源无效。 我正在使用亚马逊的s3,现在我设置了权限的存储桶策略。我在存储桶策略编辑器中写了json 当我保存它时,错误此策略包含无效的Json错误。我认为我写json格式是错误的,所以改写为 但是错误策略具有无效的资源错误。 我真的不明白为什么会发生这种 ...

6 策略中的主体无效

每当我第一次运行以下terraform文件时,我都会收到错误: 创建IAM角色SecurityMonkey时出错:MalformedPolicyDocument:策略中的无效主体:“AWS”。 但是,我执行代码第二次执行成功创建了假定角色对象。 对我而言,角色A和角色B之间的依赖关 ...

7 Wordpress的无效NameID策略

我有以下设置: Windows 2012 r2和ADFS 3.0。 将WordPress设置为SP(依赖方信任),将SimpleSAMLphp设置为IdP(声明方信任)。 我想借助SSP对WordPress用户进行身份验证。 控制流程如下:用户登录WordPress。 该页面然 ...

9 无效的策略角色 JSON

我正在关注本教程: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cli-tutorial-fargate.html 策略的 json 如下所示: 但是当我运行时: 我得到: 调用 CreateRo ...

10 存储桶策略中的主体无效

我正在尝试学习如何使用 AWS 开发 Web 应用程序,并在此研讨会构建现代 Web 应用程序之后我必须更新 s3 存储桶策略,因此按照 B 部分中的说明,我将 JSON 文件中的字符串REPLACE_ME_BUCKET_NAME替换为我创建的存储桶名称mythicalbucket1这是我得到的错误 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM