Историческая бага
2011-07-27 00:21Рыться в древних исходниках - увлекательное занятие. На днях исправил забавную ошибку в /bin/sh (из Unix версии 2.11BSD). Свободная память хранится в виде односвязного списка, проход по которому включал следующий фрагмент:
struct blk {
struct blk *word;
} *p, *q;
#define busy(x) ((int)(x)->word & 1)
p = ...;
while (! busy (q = p->word)) {
p->word = q->word;
}
Прелесть в том, что конец списка может быть нулём. В цикле - хотя это не очевидно из текста - по нулевому указателю будет извлечено слово и проверен младший разряд. Если там окажется единица - нам повезло, иначе система зацикливается. На PDP-11 по нулевому адресу располагалась инструкция SETD с кодом 0170011, и шелл прекрасно работал. На симуляторе MIPS32 тоже работал первое время, пока конфигурация не изменилась.
no subject
Date: 2011-07-27 07:31 (UTC)mov @X(R0), @R1
какой-такой SETD? нет у PDP-11 такой инструкции.
вообще, там по идее должен быть JMP или EMT/TRAP
no subject
Date: 2011-07-27 08:00 (UTC)no subject
Date: 2011-07-27 08:18 (UTC)вот так вот по простому поверх всяких TRAP TO 4 и прочих?!
no subject
Date: 2011-07-27 17:16 (UTC)no subject
Date: 2011-07-27 12:42 (UTC)no subject
Date: 2011-07-27 07:42 (UTC)no subject
Date: 2011-07-27 17:26 (UTC)Ты бы видел его стиль. Для ясности я упростил, изначально цикл выглядел так:
WHILE !busy(q = p->word) DO p->word = q->word OD
no subject
Date: 2011-07-27 07:56 (UTC)no subject
Date: 2011-07-27 08:41 (UTC)no subject
Date: 2011-07-27 08:45 (UTC)no subject
Date: 2011-07-27 09:39 (UTC)В чем проблема-то?
no subject
Date: 2011-07-27 09:44 (UTC)no subject
Date: 2011-07-27 09:48 (UTC)no subject
Date: 2011-07-27 09:53 (UTC)так же как при разговоре о системе команд z80 никто не писал 0xFF.
no subject
Date: 2011-07-27 10:13 (UTC)no subject
Date: 2011-07-27 10:09 (UTC)Вроде нормально всё. Вас старший незначащий ноль смутил?
printf("%d %d %d\n", 10, 010, 0x10 );
:)
no subject
Date: 2011-07-27 08:32 (UTC)no subject
Date: 2011-07-27 17:17 (UTC)no subject
Date: 2011-07-27 09:54 (UTC)P.S. ничего уже не помню. Единственный опкод который намертво вошел в память - 14747 - уж больно он красивый результат даёт.
no subject
Date: 2011-07-27 12:54 (UTC)no subject
Date: 2011-07-27 13:16 (UTC)И помню сказочное:
JSR PC,(PC) ; DO WHAT FOLLOWS TWICE
JSR PC,(PC) ; NO, I MEAN 4 TIMES
...
где то в недрах ODT.
Перепрыг на платформу, вещ полезная
Date: 2011-08-15 13:09 (UTC)Если по какой-то причине Purify, Valgrind и тд ошибки на регрессном тестировании не обнаруживают (а это случается, когда fuck up происходит в распределенной области памяти), то struct blk *word заменяется по
#ifdef CHECK_MODE
safe_vector word[];
#endif
который уже такие ошибки array out of bounds отстреливает.
Но в целом - shame! Делает код дороже.