首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++型结构偏移的安全检测

C++型结构偏移的安全检测
EN

Stack Overflow用户
提问于 2018-03-16 14:19:25
回答 1查看 180关注 0票数 3

我正在使用C++语法来找出一种通用的方法来跟踪类中的偏移量,有点像offsetof,但是以一种类型安全的方式,而不使用#define

我知道模板类可以是模板--除了类型和常量之外,还可以用字段进行参数化。所以我拿出了这个原型

代码语言:javascript
复制
#include <iostream>

template <typename class_type, typename field_type>
struct offsetter
{
    offsetter(const char* name, field_type class_type::*field)
        : name(name)
    {
        fprintf(stderr, "%zu\n", field);
    }

    const char* const name;
};

struct some_struct
{
    float avg;
    int min;
    int max;
    struct internal
    {
        unsigned flag;
        int x;
    } test;
    char* name;
};

int main()
{
    offsetter<some_struct, float>("%h", &some_struct::avg);
    offsetter<some_struct, int>("%h", &some_struct::min);
    offsetter<some_struct, char*>("%h", &some_struct::name);
    offsetter<some_struct, some_struct::internal>("x", &some_struct::test);

    return 0;
}

这段代码实际上能够打印字段偏移量,但我不太确定我在这里做什么。实际上,在不引用实例( field )的情况下引用field是完全错误的。

但是它做了这样的工作:打印偏移量。不过,我的猜测是,我碰到了一些漏洞,例如,我不能分配size_t offset = field

我想我可能想要这样的东西:

代码语言:javascript
复制
size_t offset = (&(std::declval<class_type>().*field) - &(std::declval<class_type>()))

但是,由于我无法获取xvalue的地址,它将无法工作:

代码语言:javascript
复制
taking address of xvalue (rvalue reference)

有办法这样做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-16 15:53:16

AFAIK没有一种标准的方法来做到这一点。甚至标准offsetof也只为标准布局类型定义。

你在做的是UB。您使用了错误的说明符zu。使用成员指针没有什么可做的。您甚至不能对它们执行指针运算,您不能转换为char*,也不能转换为整数类型。

同样,如果您的假设是成员指针只是一个整数,表示结构开头的偏移量,这不仅在理论上,而且在实践中都是假的。拥有多个继承和虚拟继承确保了这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49322944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档