簡體   English   中英

什么是“*((char *) - 1)='x';”代碼是什么意思?

[英]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';

您將值-1char * ,它為您提供指向負地址的指針,然后您嘗試將值'x'分配給此地址的內容,這絕對會給出分段錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM