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: