当前位置: 首页 > 图文教程 > 开发语言 > VC++ > C++中类的数据成员的安全隐患

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 C++中类的数据成员的安全隐患


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: n/a

C++中类的数据成员的安全隐患


作者:周云才

(江汉石油学院计算机科学系 邮编 4340023)


    在任何一本关于"C++语言程序设计"的书中都有类似于如下的描述:
    在一个类中,C++用三个关键词设置访问界限:public, private和protected。它们决定了跟在他们后面的标识符的被使用情况:public意味着其后的标识符可以被用户定义的其实例引用;而private则说明其后的标识符除了类的成员函数之外,用户定义的其实例不能引用;protected为类的继承提供了接口,同时保护其不被外界访问。
    事实上也,如果要想利用类的一个对象(或实例)来访问其成员时确实如此。但是,在C++中,由于容许将指针类型进行任意转换,从而给用户提供了一个"穿越保护屏障"的方法。这可以从以下的例程中看到:

#include class CMyClass{	double d;	int x,y;	const char ch;public:	int z;	CMyClass(int xx,int yy,char c):ch(c){x=xx,y=yy;d=9.8759;z=0;}	void Show(){	cout<<"d="<<d<<" "<<"x="<<x<<" "<<"y="<<y<<" "<<"ch="<<ch<<" ";	cout<<"z="<<z<<endl;	}};void main(){	cout<<sizeof(CMyClass)<<endl;	CMyClass p(1,2,''U'');	p.Show();	CMyClass *ptr=&p;// ptr->x=9.32145; //错误,因为x是其私有成员,外部不能直接访问。	double*dP=(double*)ptr; //获取了p.d的地址	*dP=9.32145; //修改p.d的值	int*iP=(int*)(dP+1); //获取了p.x的地址	*iP=300; //修改p.x的值	*(iP+1)=200; //修改p.y的值	*(iP+2)=65; //修改ch的值变为''A'',但ch是常数!	*(iP+3)=100; //修改p.z的值	p.Show();}运行结果如下:**********************************************24d=9.8759 x=1 y=2 ch=U z=0d=9.32145 x=300 y=200 ch=A z=100********************************************** 
    类CMyClass中有四个私有成员double d、int x,y与const char ch,通过其对象p肯定是不能察看或修改其值的,但是利用指向对象p的指针ptr我们做到了。利用将ptr转换成double* dP修改了d的值,然后再将dP转化成int*iP修改了其余所有数据成员的值。从以上的结果还看出char在类中占有与int相同大小的内存,这是因为类的alignment(边缘调整)引起的。一个更糟糕的事情是ch的值也被修改了!它可是一个const!!pointer is a god!它真是无所不能!!
指针的"不安全"性在此例中得到了充分的展示,应该对它进行限制!