Redis
 sql >> база данни >  >> NoSQL >> Redis

Какво означава кодът *((char*)-1) ='x'?

Актуализиране

Намерих реда в debug.c, споменат в OP и можем да видим от два реда над този код:

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) е валиден адрес? казва в повечето системи, че няма да е валидно за достъп, да не говорим за присвояване на стойност. Това ще генерира грешка при сегментиране на повечето съвременни операционни системи.

Това е недефинирано поведение и както беше разгледано в нишката Какъв е най-простият стандартен начин за създаване на Segfault в C? не може да се разчита. Компилаторите стават все по-умни и има някои известни примери, при които компилаторът е умен за използване на недефинирано поведение по неочаквани и лоши начини.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Python Reddis Queue ValueError:Функциите от модула __main__ не могат да бъдат обработени от работници

  2. Архитектура на микросервизи за много чест достъп до данни; в решения за памет?

  3. Задачата за целина винаги ИЗЧАКВА

  4. Как мога да получа стойността от Redis и да я поставя в променлива в NGiNX?

  5. Как да настроя/получа pandas.DataFrame към/от Redis?