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