Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Mã * ((char *) - 1) ='x' có nghĩa là gì?

Cập nhật

Tôi đã tìm thấy dòng trong debug.c được đề cập trong OP và chúng ta có thể thấy từ hai dòng phía trên mã này:

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

và bạn có thể tìm thấy mã tương tự trong _redisPanic cũng như vậy, có vẻ như cách họ buộc SIGSEGV khi một khẳng định không thành công hoặc có sự hoảng loạn.

Bản gốc

Đây trông giống như một công cụ gỡ lỗi, chúng ta có thể xem từ tài liệu này hướng dẫn gỡ lỗi Redis và phần có liên quan cho biết:

Redis có một lệnh để mô phỏng một lỗi phân đoạn (nói cách khác là một sự cố tồi tệ) bằng cách sử dụng lệnh DEBUG SEGFAULT (tất nhiên là không sử dụng nó với phiên bản sản xuất thực;). Vì vậy, tôi sẽ sử dụng lệnh này để xử lý phiên bản của tôi để hiển thị những gì xảy ra ở phía GDB:

và hiển thị đầu ra gdb này:

 (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';
             ^^^^^^^^^^^^^^^^^^^

Những gì nó đang làm là truyền -1 thành * char ** và sau đó thực hiện điều hướng trên đó và gán 'x' đến vị trí bộ nhớ đó. Là chủ đề mà alk liên kết Liệu ((void *) -1) có phải là địa chỉ hợp lệ không? cho biết trên hầu hết các hệ thống, nó sẽ không hợp lệ để truy cập, chứ chưa nói đến việc gán giá trị cho. Điều này sẽ tạo ra lỗi phân đoạn trên hầu hết các hệ điều hành hiện đại.

Đây là hành vi không xác định và như đã được trình bày trong chủ đề Cách tuân thủ tiêu chuẩn đơn giản nhất để tạo Segfault trong C là gì? nó không thể được dựa vào. Các trình biên dịch ngày càng thông minh hơn và có một số ví dụ nổi tiếng trong đó trình biên dịch rất thông minh trong việc khai thác hành vi không xác định theo những cách không mong muốn và xấu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jedis Thay đổi ngữ nghĩa của Redis?

  2. Docker-compos, vẫn để chỉ định một tệp redis.conf?

  3. Sự khác biệt giữa phương pháp HSET và HMSET trong cơ sở dữ liệu redis là gì

  4. Bảng lừa đảo tối ưu hóa bộ nhớ của Redis

  5. nô lệ redis sẽ không đồng bộ với chủ