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: