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 -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

