[英]What does “*((char*)-1) = 'x';” code mean?
我在閱讀redis源代碼時遇到問題,有人能告訴我_redisAssert
函數中最后一個語句的_redisAssert
是什么 :
*((char*)-1) = 'x';
更新
我在OP中提到的debug.c中找到了這行,我們可以從這段代碼上面的兩行看到:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
並且在_redisPanic
也可以找到相同的代碼,因此當斷言失敗或出現恐慌時,它看起來像是強制SIGSEGV
的方式。
原版的
這看起來像一個調試工具,我們可以從這個文件中看到Redis調試指南和相關部分說:
Redis有一個使用DEBUG SEGFAULT命令模擬分段錯誤(換句話說是一個糟糕的崩潰)的命令(當然不要將它用於真實的生產實例;)。 所以我將使用此命令來崩潰我的實例以顯示GDB端發生的事情:
並顯示此gdb輸出:
(gdb) continue
Continuing.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffffffffff
debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
^^^^^^^^^^^^^^^^^^^
它正在做的是將-1
轉換為* char **,然后對其執行間接操作並將'x'
分配給該內存位置。 作為alk鏈接的線程是((void *)-1)一個有效的地址? 在大多數系統上說它無法訪問,更不用說分配值了。 這將在大多數現代操作系統上生成分段錯誤 。
這是未定義的行為 ,因為在線程中已經過去了什么是在C中生成Segfault的最簡單的標准符合方式? 它不能被依賴。 編譯器變得越來越聰明,並且有一些着名的例子, 編譯器很聰明地以意外和壞的方式利用未定義的行為 。
在你的表達式中*((char*)-1) = 'x';
:
您將值-1
為char *
,它為您提供指向負地址的指針,然后您嘗試將值'x'
分配給此地址的內容,這絕對會給出分段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.