Возвращают char вместо const char? Может я упускаю какой-то сакральный смысл? Просто преобразование `return (char *)s;`, нарушает все допустимые нормы программирования (MISRA, NASA JPL, etc). Да и просто по логике - взяли константную строку на вход, на выходе позволяем делать с ней все, что угодно.
Перечисленные тобой «стандарты качества кода» нужны далеко не везде. Более того, они предназначены не для «удобства программиста», а для уменьшения количества ошибок в результирующем коде. Поэтому кому-то придется оборачивать тело strstr в макрос и делать два варианта функции, а кто-то просто повторит интерфейс libc-шной и будет доволен.
Тогда нарушается соглашение о const-входящего параметра. Компилятор не сможет без него нормально заоптимизировать. Я ж говорю, АПИ спроектировано глупо.
Во-первых, покажи, в каком месте у меня нарушилось соглашение о const.
Во-вторых, компилятор не полагается на const — это сахарок для человека. С точки зрения алиасинга const char* и char* — одинаковые типы. Наглядная демонстрация: https://godbolt.org/g/h248nf (если убрать restrict, загрузка из const char* указателя будет происходить на каждой итерации цикла).
И в-третьих, я даже представить не могу, каким образом const-квалификаторы могут на что-то повлиять, когда кругом выполняются только операции чтения.
Каждый раз, когда топящий за высокие стандарты кодирования не вписывает return во все бранчи функции, я начинаю думать, что этими высокими стандартами он исключительно троллит на форуме. Чем ты вообще компилируешь-то, что такой код на выходе?
В наш век смотрится не очень, и я вполне могу себе представить ситуацию, когда символ будет найден как раз в самом конце 4-гигабайтного блока данных. ssize_t.
Я рад, что мне не нужно следовать некоторым убогим правилам, поэтому останусь с любимым паттерном TYPE* search(const TYPE*, ...).
Г-пади, да что вы прицепились к этому ssize_t? Вы для чего типик создали, чтобы показать своё упрямство? Или типа с одними не прокатило, так с другими попробуем?
Представьте, что ваш if(pos >= 0) в глубоко вложенной функции от текущей. Удобно? Да ОТВРАТИТЕЛЬНО!
Вам все равно надо проверять на NULL. ВСЕГДА. И в чем разница? с ssize_t даже errno становится не нужен - можно передать тип ошибки через -1, -2, -3...
Да блин, опять 25. Ясен пень. Но на NULL мы проверяем str, а вам надо в каждую функцию тянуть этот pos. Который нафиг не нужен, ибо нам надо str+pos везде, а не foo(str+pos, pos).