Solidity

如果你不更新彙編中的空閒記憶體指針怎麼辦?

  • July 19, 2022

使用內聯彙編時,空閒記憶體指針最初指向 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變成因為現在使用0x0532 個字節來儲存長度欄位。是 5 個 ASCII 字元長,所以它的長度是 5 個字節。0x80``myString``hello

如果您想確保記憶體空間是安全的(沒有副作用),那麼您必須通過遞增空閒記憶體指針來分配記憶體。只要您將該記憶體空間視為暫存空間,就可以在空閒記憶體指針上方使用記憶體但不分配它是完全可以的。您可以在文件中閱讀有關它的更多資訊。

我希望這回答了你的問題。

引用自:https://ethereum.stackexchange.com/questions/131969