微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Aws::S3::Model::StorageClassMapper::GetStorageClassForName 时崩溃

如何解决使用 Aws::S3::Model::StorageClassMapper::GetStorageClassForName 时崩溃

我使用的是 AWS 1.7.120(如果您无法重现此问题,则可能是由于行为改变所致)。

我发现了一些看似无辜的电话崩溃的案例。运行此代码时,您会看到崩溃前的“Before call 3”。

TEST(S3AccessFromContextTest,basic_SC)
{
    Aws::S3::Model::StorageClass storage_class;

    std::cout << "Before call 1" << std::endl;
    storage_class = Aws::S3::Model::StorageClassMapper::GetStorageClassForName("Invalid StorageClass value");
    std::cout << "After call 1" << std::endl;
    Aws::SDKOptions _awsSDKOptions;

    Aws::InitAPI(_awsSDKOptions);

    std::cout << "Before call 2" << std::endl;
    storage_class = Aws::S3::Model::StorageClassMapper::GetStorageClassForName("Invalid StorageClass value");
    std::cout << "After call 2" << std::endl;

    Aws::ShutdownAPI(_awsSDKOptions);

    std::cout << "Before call 3" << std::endl;
    storage_class = Aws::S3::Model::StorageClassMapper::GetStorageClassForName("Invalid StorageClass value");
    std::cout << "After call 3" << std::endl;
}

现在,...GetStorageClassForName() 函数是这样的:

StorageClass GetStorageClassForName(const Aws::String& name)
{
  int hashCode = HashingUtils::HashString(name.c_str());
  if (hashCode == STANDARD_HASH)
  {
    return StorageClass::STANDARD;
  }
  // Handle rest of kNown cases
  else if (hashCode == REDUCED_REDUNDANCY_HASH)
  {

  }

  EnumParSEOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
  if(overflowContainer)
  {
    overflowContainer->StoreOverflow(hashCode,name);
    return static_cast<StorageClass>(hashCode);
  }

  return StorageClass::NOT_SET;
}

我每次都只期望 NOT_SET 值。这是第一次发生的情况,因为 overflowContainer 为空。但是第二次它不是,但都无效。它最终使用了一些未正确初始化的指针(并且在调用它们的方法时崩溃)。

虽然很明显所有调用都应该在 InitAPI 和 ShutdownAPI 之间进行,

  1. 人们会期望一个不需要这个的 enum-to-string
  2. 这不会在 InitAPI 之前失败,只会在 Shutdown 之后失败。

是否有任何想法、修复或建议表明这是一个错误,无论是来自 AWS 代码还是我的......? 虽然我坚持 1.,但如果我将块 3 包含在 InitAPI/ShutdownAPI 中,它就可以工作。不过,在调用初始化代码之前我需要该值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。