Re: [问题] 为什么两个 pointer 不能转 const

楼主: RealJack   2015-02-08 23:03:23
来段程式好了
这个问题要分成内建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 = &ap; //这是被禁止的,但是加上-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.执行期都不会挂,执行期应该不会去检查,这会影响效率
作者: purpose (秀才遇到肥宅兵)   2015-02-09 00:08:00
我有在 Windows 用 g++ 编译试过,const int 刚好被放在唯读内存,所以有碰过改完 Runtime 当掉的状况。至于 x 还是 1 没变 5566,那是编译器在编译时,就直接把值写死成 1,他不会在 Runtime 重新读取 x 的内容
楼主: RealJack   2015-02-09 15:04:00
我觉得还是有点问题,编译会直接写死应该只有宏之类才
作者: uranusjr (←這人是超級笨蛋)   2015-02-09 15:05:00
@RealJack 世界上有个技术叫最佳化
楼主: RealJack   2015-02-09 15:06:00
会发生,我把const全部去掉后发现内建type的值会改变然后用objdump比较这两个.o档,发现组语都一样http://ppt.cc/1SKb这样要如何解释加const和没有const的行为会不一样呢?
作者: dirkc (3781615)   2015-02-09 15:36:00
其实改了,只是之后用到符号x的时候极可能会直接置换成常数1改成int y=1;const int x=y;或volatile const int x=1;就会看出一楼说的差别,因为会强制使用可读写位址存放x编译器也不会把符号x置换成常数1@RJ 你把x丢入函式(例如printf)再看组语就知道丢x和丢*p是不同结果,因为x可能会直接被置换成常数const这个字在执行期没有意义,执行后只看memory protection本质上不是效率考量,精确说是根本不考量
作者: purpose (秀才遇到肥宅兵)   2015-02-09 18:12:00
楼主: RealJack   2015-02-09 18:24:00
我先研究一下好了...背后有很多些东西要厘清@@再请教一下要如何确定变量被放在唯读的内存区块,感谢!
作者: purpose (秀才遇到肥宅兵)   2015-02-09 18:30:00
http://i.imgur.com/CUAb5jf.png 我下中断点看到 x 的位址后,这个 debugger 有提供内存分布资讯,其中的00409000 起始位址这项目,它的存取字段只有写 R 就唯读
作者: dirkc (3781615)   2015-02-10 09:53:00
通常要确定就是用debugger去看编译后结果,像楼上的反组译显示x存在0x409050,p则是用堆叠esp+1c的位址;然后现在os基本上除了堆叠和堆积几乎都是唯读,也可以用debugger查询怎么配是编译器的决定,不过字面常数或全域const容易配唯读应该说怎么配是编译器的初稿,os的定案;编译器决定位置,os可决定rwx读写执行权限,也可能修改区块基底位址(ASLR)(这里说的编译器指的是同时有编译,组译,连结功能的程式)有点想说通常写程式不用去探究这些;今天就是因为某种程度而言欺骗了编译器(先告诉它const而后又要去改),既然越过了编译器,就需要更底层的资讯来解释发生的现象

Links booklink

Contact Us: admin [ a t ] ucptt.com