mirror of
https://github.com/JakeHillion/object-introspection.git
synced 2024-11-09 21:24:14 +00:00
Avoid following weak_ptrs
Previously, we treated weak_ptrs as normal types and we recursed within them, following the internal data pointer and possibly causing crashes. We really shouldn't be following them, so I added a custom type to simply abort processing. If we want to handle them (ie: check if they are valid, and follow them if so), that should be fairly easy with the work there is here so far.
This commit is contained in:
parent
fb58ccebac
commit
e27f725a85
@ -45,4 +45,5 @@ containers = [
|
|||||||
"PWD/types/caffe2_blob_type.toml",
|
"PWD/types/caffe2_blob_type.toml",
|
||||||
"PWD/types/std_variant.toml",
|
"PWD/types/std_variant.toml",
|
||||||
"PWD/types/thrift_isset_type.toml",
|
"PWD/types/thrift_isset_type.toml",
|
||||||
|
"PWD/types/weak_ptr_type.toml",
|
||||||
]
|
]
|
||||||
|
@ -62,7 +62,8 @@ namespace fs = std::filesystem;
|
|||||||
X(ENUM_MAP_TYPE) \
|
X(ENUM_MAP_TYPE) \
|
||||||
X(BOOST_BIMAP_TYPE) \
|
X(BOOST_BIMAP_TYPE) \
|
||||||
X(STD_VARIANT_TYPE) \
|
X(STD_VARIANT_TYPE) \
|
||||||
X(THRIFT_ISSET_TYPE)
|
X(THRIFT_ISSET_TYPE) \
|
||||||
|
X(WEAK_PTR_TYPE)
|
||||||
|
|
||||||
enum ContainerTypeEnum {
|
enum ContainerTypeEnum {
|
||||||
#define X(name) name,
|
#define X(name) name,
|
||||||
|
@ -761,10 +761,11 @@ bool OICodeGen::enumerateTemplateParamIdxs(drgn_type* type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not add `shared_ptr<void>` or `unique_ptr<void>`
|
// Do not add `shared_ptr<void>`, `unique_ptr<void>`, or `weak_ptr<void>`
|
||||||
// to `containerTypeMapDrgn`.
|
// to `containerTypeMapDrgn`.
|
||||||
if (containerInfo.ctype == SHRD_PTR_TYPE ||
|
if (containerInfo.ctype == SHRD_PTR_TYPE ||
|
||||||
containerInfo.ctype == UNIQ_PTR_TYPE) {
|
containerInfo.ctype == UNIQ_PTR_TYPE ||
|
||||||
|
containerInfo.ctype == WEAK_PTR_TYPE) {
|
||||||
drgn_qualified_type t{};
|
drgn_qualified_type t{};
|
||||||
// We checked that this succeeded in the previous loop
|
// We checked that this succeeded in the previous loop
|
||||||
drgn_template_parameter_type(&tParams[0], &t);
|
drgn_template_parameter_type(&tParams[0], &t);
|
||||||
|
@ -618,6 +618,9 @@ void TreeBuilder::processContainer(const Variable& variable, Node& node) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WEAK_PTR_TYPE:
|
||||||
|
// Do not handle weak pointers beyond their static size for now.
|
||||||
|
break;
|
||||||
case SHRD_PTR_TYPE:
|
case SHRD_PTR_TYPE:
|
||||||
case UNIQ_PTR_TYPE:
|
case UNIQ_PTR_TYPE:
|
||||||
node.pointer = next();
|
node.pointer = next();
|
||||||
|
@ -41,6 +41,7 @@ containers = [
|
|||||||
"../types/caffe2_blob_type.toml",
|
"../types/caffe2_blob_type.toml",
|
||||||
"../types/std_variant.toml",
|
"../types/std_variant.toml",
|
||||||
"../types/thrift_isset_type.toml",
|
"../types/thrift_isset_type.toml",
|
||||||
|
"../types/weak_ptr_type.toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
[headers]
|
[headers]
|
||||||
|
@ -179,3 +179,97 @@ definitions = '''
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
'''
|
'''
|
||||||
|
[cases.weak_ptr_int64_empty]
|
||||||
|
param_types = ["std::weak_ptr<std::uint64_t>&"]
|
||||||
|
setup = "return std::weak_ptr<std::uint64_t>();"
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
[cases.weak_ptr_int64_void_empty]
|
||||||
|
param_types = ["std::weak_ptr<void>&"]
|
||||||
|
setup = "return std::weak_ptr<void>();"
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
[cases.weak_ptr_int64_present]
|
||||||
|
param_types = ["std::weak_ptr<std::uint64_t>&"]
|
||||||
|
setup = '''
|
||||||
|
static std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
|
||||||
|
std::weak_ptr<std::uint64_t> weak = shd;
|
||||||
|
return weak;
|
||||||
|
'''
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
[cases.weak_ptr_int64_expired]
|
||||||
|
param_types = ["std::weak_ptr<std::uint64_t>&"]
|
||||||
|
setup = '''
|
||||||
|
std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
|
||||||
|
std::weak_ptr<std::uint64_t> weak = shd;
|
||||||
|
return weak;
|
||||||
|
'''
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
[cases.weak_ptr_int64_present_chase]
|
||||||
|
param_types = ["std::weak_ptr<std::uint64_t>&"]
|
||||||
|
cli_options = ["--chase-raw-pointers"]
|
||||||
|
setup = '''
|
||||||
|
static std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
|
||||||
|
std::weak_ptr<std::uint64_t> weak = shd;
|
||||||
|
return weak;
|
||||||
|
'''
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
[cases.weak_ptr_int64_expired_chase]
|
||||||
|
param_types = ["std::weak_ptr<std::uint64_t>&"]
|
||||||
|
cli_options = ["--chase-raw-pointers"]
|
||||||
|
setup = '''
|
||||||
|
return std::make_shared<std::uint64_t>(0xDEADBEEF);
|
||||||
|
'''
|
||||||
|
expect_json = '''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"staticSize": 16,
|
||||||
|
"exclusiveSize": 16,
|
||||||
|
"dynamicSize": 0,
|
||||||
|
"NOT": "members"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
22
types/weak_ptr_type.toml
Normal file
22
types/weak_ptr_type.toml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
[info]
|
||||||
|
typeName = "std::weak_ptr"
|
||||||
|
numTemplateParams = 1
|
||||||
|
ctype = "WEAK_PTR_TYPE"
|
||||||
|
header = "memory"
|
||||||
|
ns = ["namespace std"]
|
||||||
|
replaceTemplateParamIndex = []
|
||||||
|
|
||||||
|
[codegen]
|
||||||
|
decl = """
|
||||||
|
template<typename T>
|
||||||
|
void getSizeType(const %1%<T> &s_ptr, size_t& returnArg);
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Weak pointers do not have ownership, so let's not follow them (for now)
|
||||||
|
func = """
|
||||||
|
template<typename T>
|
||||||
|
void getSizeType(const %1%<T> &s_ptr, size_t& returnArg)
|
||||||
|
{
|
||||||
|
SAVE_SIZE(sizeof(%1%<T>));
|
||||||
|
}
|
||||||
|
"""
|
Loading…
Reference in New Issue
Block a user