如何解决使用 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 之间进行,
- 人们会期望一个不需要这个的 enum-to-string
- 这不会在 InitAPI 之前失败,只会在 Shutdown 之后失败。
是否有任何想法、修复或建议表明这是一个错误,无论是来自 AWS 代码还是我的......? 虽然我坚持 1.,但如果我将块 3 包含在 InitAPI/ShutdownAPI 中,它就可以工作。不过,在调用初始化代码之前我需要该值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。