您的位置:首页 > 编程语言 > C语言/C++

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

2018-02-28 20:44 633 查看
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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  brpc