Зачем переопределить strlen как цикл + вычитание?

На основе этого вопроса о следующем коде из 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 () ?

19
задан Community 23 May 2017 в 12:26
поделиться