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/

