На основе этого вопроса о следующем коде из SQLite3:
static int strlen30(const char *z){
const char *z2 = z;
while( *z2 ){ z2++; }
return 0x3fffffff & (int)(z2 - z);
}
, который сопровождается сообщением фиксации , в котором говорится, что эта функция помогает с int
переполняется.
Меня особенно интересует эта часть:
const char *z2 = z;
while( *z2 ){ z2++; }
для меня этот цикл продвигается вперед z2
до тех пор, пока z2
не указывает на нулевой терминатор. Затем z2-z
дает длину строки.
Почему бы не использовать strlen ()
для этой части и переписать так:
return 0x3fffffff & (int)(strlen(z));
Зачем использовать цикл + вычитание вместо strlen ()
? Что может делать цикл + вычитание, чего не может strlen ()
?