복붙노트

[REDIS] 코드의 의미를 - " 'X'= * ((1) (문자 *를))"무슨 일입니까?

REDIS

코드의 의미를 - " 'X'= * ((1) (문자 *를))"무슨 일입니까?

나는 독서에 문제가 소스 코드, 캔 사람이 debug.c의 _redisAssert 기능의 마지막 문장의 사용이 무엇인지 말해 레디 스했다 :

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

해결법

  1. ==============================

    1.최신 정보

    최신 정보

    나는 debug.c의 라인이 OP에서 언급하고 우리가이 코드를 위의 두 라인에서 볼 수있는 발견 :

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

    와 같은 코드는 _redisPanic에서 찾을 수 있습니다뿐만 아니라, 그래서 주장에 오류가 발생하거나 패닉이있을 때 SIGSEGV를 강제로 자신의 방법처럼 보인다.

    기발한

    디버깅 도구 등이 외모, 우리는 가이드와 관련 섹션 말한다 디버깅이 문서 레디 스에서 볼 수있다 :

    및 프로그램이 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 캐스팅 한 다음에 간접을 수행하고 그 메모리 위치에 'x'를 지정합니다. 스레드로서 ALK는 ((무효 *) -1) 유효 주소를 연결하는 것이? 이 접근 유효 커녕에 값을 할당하지 않습니다 대부분의 시스템에 말했다. 이것은 대부분의 현대 운영 체제에서 세그먼트 오류를 ​​생성합니다.

    이것은 정의되지 않은 동작과 같은 간단한 표준 C의 세그먼트 폴트를 생성하는 방법을 준수 무엇 스레드에 가서했다? 그것은 의존 할 수 없습니다. 컴파일러는 스마트지고 컴파일러가 예상치 못한 나쁜 방법으로 정의되지 않은 동작을 악용에 대한 스마트 일부 유명한 예가있다.

  2. ==============================

    2.당신의 표현 *에서 ((의 char *) - 1) 'x'를 ;: =

    당신의 표현 *에서 ((의 char *) - 1) 'x'를 ;: =

    당신은 값 -1 문자에 * 다음은 절대적으로 제공이 주소의 내용 값을 'X'할당하십시오하려고 부정적인 주소로 당신에게 포인터를 제공 캐스팅하고 세그먼트 오류.

  3. from https://stackoverflow.com/questions/20844863/what-does-char-1-x-code-mean by cc-by-sa and MIT license