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

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



Hello!

On Friday 21 August 2009 16:11:21 Stanislav Maslovski wrote:
> if ( sqlite3_value_type(argv[2]) == SQLITE_INTEGER &&
> sqlite3_value_int(argv[2]) >= 0 && sqlite3_value_int(argv[2]) <= 32 )
>                           ^^^^^^
> 
> Алексей, тут нужна проверка на строго больше 0, иначе ты можешь
> заработать undefined поведение со сдвигом в строке ниже, см. мои
> соседние письма в этом треде. Или надо переписать вычисление битовой
> маски, если ты хочешь-таки включить в обработку (имхо, вымороченный)
> случай с /0.

Не вижу проблемы, т.к.
mask = ~ ( (((u_int32_t)1) << (32 - mask)) -1 );

Специально условие записал так, что вычисление с /0 корректно выполнялось.
Выражение, конечно, не очень очевидное, лучше бы таких избегать.

Правда, маска 0 это наверняка ошибка вызывающего приложения, так что,
подумав, сделал возврат NULL в этом случае. Теперь переписал вычисление 
маски, чтобы с /32 работало без доп. проверки, т.е.

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

Теперь должно работать платформо-независимо. да и читается легче.

> Также, я вижу, что ты оставил в других местах atoi(). Имхо, если
> позволяет переносимость, то лучше что-нибудь вроде strtol().
> 
> strtol() conforms to SVr4, 4.3BSD, C89, C99 and POSIX.1-2001.
> 
Зачем? Если маску /0 не использовать, то atoi() оптимальнее.


Best regards, Alexey Pechnikov.
http://pechnikov.tel/

Reply to: