while (*s1 && *s2) ?  Then the invalid assumption at L124 that s1 is longer than s2 can go.  Also, std::string overloads operater[], so this can probably be something like...

```C++
sizet_t i = 0;
while (str1[i] && str2[i])
{
  if (::tolower(str1[i]) != ::tolower(str2[i])
    return false;
  i++;
}

return !(str1[i] || str2[i])
```

which will also suppresses the "Warning: Control reaches end of non-void function" this presumably introduces. :)