Solidity
如果你不更新彙編中的空閒記憶體指針怎麼辦?
使用內聯彙編時,空閒記憶體指針最初指向 0x80。然後假設我在該記憶體地址儲存一些值,如下所示:
assembly { let ptr := mload(0x40) mstore(ptr, "Bytes32 value") }
這意味著在地址 0x80 處儲存了 bytes32 值。現在假設我結束了組裝塊並繼續編碼,並且有一些操作需要記憶體。
但是空閒記憶體指針沒有更新。
會發生什麼?它會覆蓋我的數據嗎?
非常感謝,希望清楚。
會發生什麼?它會覆蓋我的數據嗎?
是的,如果下面的程式碼遵循solidity 的記憶體模型並使用記憶體,它將從返回的地址開始寫入
mload(0x40)
並覆蓋您的數據。function example() public pure returns (bytes32, string memory) { bytes32 myValue; assembly { // mload(0x40) is 0x80 initially mstore(mload(0x40), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) } string memory myString = "hello"; assembly { myValue := mload(0x80) } // myValue : 0x0000000000000000000000000000000000000000000000000000000000000005 // myString : 'hello' return (myValue, myString); }
在這裡,
myValue
變成因為現在使用0x05
32 個字節來儲存長度欄位。是 5 個 ASCII 字元長,所以它的長度是 5 個字節。0x80``myString``hello
如果您想確保記憶體空間是安全的(即沒有副作用),那麼您必須通過遞增空閒記憶體指針來分配記憶體。只要您將該記憶體空間視為暫存空間,就可以在空閒記憶體指針上方使用記憶體但不分配它是完全可以的。您可以在文件中閱讀有關它的更多資訊。
我希望這回答了你的問題。