来段程式好了
这个问题要分成内建type和自定义class
这两个会有不同的结果
由于要让违法的语法compile过,所以加上-fpermissive这个flag
<状况一: 自定义class>
class aaa
{
public:
void modify(int s){i=s;}
void print()const{cout<<i<<endl;}
private:
int i=1;
};
int main()
{
aaa const** aq; //老大
aaa* ap; //老二
const aaa ax; //老三
aq = ≈ //这是被禁止的,但是加上-fpermissive暂时编译过
*aq = &ax; //由于*aq=ap,所以ap指向ax
ap->modify(5566); //ax.i变成5566 !!! 执行期没有挂
ax.print();
}
<状况二: 内建type>
int const** q;
int* p;
const int x=1;
q = &p;
*q = &x;
*p=5566; //x还是1并没变5566,执行期没有挂
<结论>
1.基于安全考量所以int **不能转成int const ** (可以参考上篇po文)
2.自定义class的const物件用走漏洞的方式可以更改
3.内建type的const变量用走漏洞的方式改不动,我不知道为什么,有请高手解释
4.执行期都不会挂,执行期应该不会去检查,这会影响效率