[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Программирование на функциональных языках - как научить?



On Fri, Aug 21, 2009 at 01:54:25AM +0400, Alexey Pechnikov wrote:
> Hello!
> 
> On Friday 21 August 2009 00:58:35 Stanislav Maslovski wrote:
> > Что будет, например, с таким вызовом?
> > 
> > isinnet( '172.16.1.23', '172.16.1.0', 'aa' )
> > 
> > Имхо, переменная mask в этом случае окажется равной нулю (после всех
> > действий со сдвигами и пр.) и проверка в конце функции всегда вернет
> > true, не зависимо от ad и net.
> > 
> 
> sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 'aa' );
> 0

Ух ты, как интересно! Я даже проверять полез в gcc.
Вот такой кусок кода дает 0xffffffff в результате:

u_int32_t mask = 0;
mask = ~ ( (((u_int32_t)1) << (32 - mask)) -1 );

Чешем репу и вспоминаем, что сдвиги беззнаковых у нас циклические, а
не арифметические! С арифметическим сдвигом получится 0, как я и писал.

То есть, код будет весьма интересно "работать" даже в случае
числа в третьем аргументе:

select isinnet( '172.16.1.23', '172.16.1.0', '56' ) например ;-)
 
> Следовало бы вернуть NULL, что есть более концептуально верно.

Концептуально верно будет, имхо, переписать.

-- 
Stanislav


Reply to: