问题描述
我使用的是 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 (将#修改为@)