- 1
if( str[0] == '<' || str[1] == '?' || str[2] == 'x' || str[3] == 'm' || str[4] == 'l') {...}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+30
if( str[0] == '<' || str[1] == '?' || str[2] == 'x' || str[3] == 'm' || str[4] == 'l') {...}
Проверка на xml-ность
Ну а что касается кода... ну пренебрегает автор strncmp, с кем не бывает.
if( str[0] != '<' || str[1] != '?' || str[2] != 'x' || str[3] != 'm' || str[4] != 'l') {...}
Это проверка на "подозрение на xml-ность" :)
Close enough.
и 2) проверять на 2, 4 и 8 символьные литералы тоже, и на будущее 16-символьные тоже неплохо бы
Не портабельно. Два наиболее разумных варианта предусмотрены, но всё равно!
... хотя - то же самое что в топике :)
[trollmode=on]
Только топик работает на строках короче четырех символов, а ваш код - UB.
str = "<?" - 3 байта, '<' '?' и нолик. Код из топика (если не забыть заменить || на &&) остановится на нолике и корректно выдаст false, ваш же код прочитает 1 лишний байт за буфером. Да, согласен, на 32битной платформе краш при этом маловероятен (Но если буфер начинался за 3 байта до конца странички, за которой следует невыделенная память - то таки возможен). Но это UB, а UB это как заряженное ружье висящее на стене, которое когда-нибудь выстрелит.
К тому же на некоторых платформах этот код не сможет нормально работать из-за требований к выравниванию, endianess и размеру long'а.
[/trollmode]