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

What does “*((char*)-1) = 'x';” code mean?

我在读取redis源代码时遇到问题,有人能告诉我debug.c中_redisAssert函数中最后一条语句的用法是什么吗?

1
*((char*)-1) = 'x';


更新

我在debug.c中找到了op中提到的行,我们可以从上面的两行代码中看到:

1
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");

同样的代码也可以在_redisPanic中找到,因此当断言失败或出现恐慌时,它们看起来像是强制SIGSEGV的方法。

原件

这看起来像一个调试工具,我们可以从本文档中看到Redis调试指南,相关部分说:

Redis has a command to simulate a segmentation fault (in other words a bad crash) using the DEBUG SEGFAULT command (don't use it against a real production instance of course ;). So I'll use this command to crash my instance to show what happens in the GDB side:

并显示该gdb输出:

1
2
3
4
5
6
7
8
 (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'分配给这个地址的内容,这个地址绝对给出分割错误。