On Fri, Aug 21, 2009 at 03:29:29PM +0400, Alexey Pechnikov wrote: > Hello! > > On Friday 21 August 2009 02:37:44 Stanislav Maslovski wrote: > > То есть, код будет весьма интересно "работать" даже в случае > > числа в третьем аргументе: > > > > select isinnet( '172.16.1.23', '172.16.1.0', '56' ) например ;-) > > > > > Следовало бы вернуть NULL, что есть более концептуально верно. > > > > Концептуально верно будет, имхо, переписать. > Да, проверок входных данных явно не хватало :-) Добавил, заодно код упростил, > а то вложенные if не есть хорошо. Заодно сделал проверку типа данных: > > sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 56 ); > > sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 32 ); > 0 > sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '32' ); > > sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '255.255.255.0' ); > 1 > sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '255.255.255.255' ); > 0 > > Ну и дописал пару-тройку тестов. Новую версию и деб-пакет выложил.
if ( sqlite3_value_type(argv[2]) == SQLITE_INTEGER && sqlite3_value_int(argv[2]) >= 0 && sqlite3_value_int(argv[2]) <= 32 ) ^^^^^^ Алексей, тут нужна проверка на строго больше 0, иначе ты можешь заработать undefined поведение со сдвигом в строке ниже, см. мои соседние письма в этом треде. Или надо переписать вычисление битовой маски, если ты хочешь-таки включить в обработку (имхо, вымороченный) случай с /0. Также, я вижу, что ты оставил в других местах atoi(). Имхо, если позволяет переносимость, то лучше что-нибудь вроде strtol(). strtol() conforms to SVr4, 4.3BSD, C89, C99 and POSIX.1-2001. -- Stanislav -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org