【brpc】C++关于private的一则hack

brpc是百度开源的RPC框架,github:https://github.com/brpc/brpc,初步看了下描述:performance据其官方测试数据(本人未亲测),基本上比其他内外部RPC框架都要优秀,但我个人比较感兴趣的还是对各种protocol的自适应支持,提供灵活扩展接口,这个不错,源码只是大概翻了下,还没细看!

关于pb协议头文件有个hack小技巧,代码如下:

// Since kDefaultTotalBytesLimit is private, we need some hacks to get the limit.
// Works for pb 2.4, 2.6, 3.0
#define private public
#include <google/protobuf/io/coded_stream.h>
const int PB_TOTAL_BYETS_LIMITS_RAW =
    google::protobuf::io::CodedInputStream::kDefaultTotalBytesLimit;
const uint64_t PB_TOTAL_BYETS_LIMITS =
    PB_TOTAL_BYETS_LIMITS_RAW < 0 ? (uint64_t)-1LL : PB_TOTAL_BYETS_LIMITS_RAW;
#undef private

为了获取pb最大字节限制,将private hack为public,这样就可以顺利拿到值了。

当然更暴力点的是,直接改成public不就完了吗,虽然值也能拿到,但是相比hack这种trick手法,未免过于暴力,还有最重要的实施起来需要用户在本地pb头文件修改,而且影响全局,用户未必知道并且愿意去做,就会编译报错或拿不到,框架hack是相对比较优雅的方式。


自己写了各小测试代码,gcc 4.8+验证ok,代码如下:

a.h

#ifndef _A_H_
#define _A_H_

class A
{
public:
    A() : m_a(1) {}

private:
    int m_a;
};

#endif // _A_H_

main.cpp

#include <stdio.h>

#define private public
#include "a.h"
#undef private

int main()
{
    A a;
    printf("private m_a=%d\n", a.m_a);
    return 0;
}

输出:

private m_a=1

hack获取类privat成员还有其他方法,诸如计算内存offset等,但这种对于变化的第三方class文件(如果用户修改了pb头文件变量顺序,当然极少有用户这么做),可控性较差,避免所有都编译成功,最后运行不了,出现诡异的bug!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值