什么是“*((char *) – 1)=’x’;”代码是什么意思?

我在阅读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'分配给这个地址的内容,这绝对地给出了一个分段错误。