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

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



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


Reply to: