strlen
- довольно простая функция, и, очевидно, O (n) вычисляется. Тем не менее, я видел несколько подходов, которые работают более чем на одного персонажа за раз. См. Пример 5 здесь или этот подход здесь. Основным способом этой работы является реинтерпрет-литье буфера char const*
в буфер uint32_t const*
, а затем проверка по четыре байта за раз.
Лично моя реакция кишки заключается в том, что это ожидаемое segfault, потому что я могу разыменовать до трех байтов вне действительной памяти. Тем не менее, это решение, похоже, держится, и мне кажется любопытным, что что-то настолько явно сломанное выдержало испытание временем.
Я думаю, что это включает UB по двум причинам:
- Потенциальная развязка вне допустимой памяти
- Потенциальное разыменование неглавного указателя
( Обратите внимание, что проблема с псевдонимом отсутствует, можно подумать, что uint32_t
псевдонимы как несовместимый тип и код после strlen
(например, код, который может изменить строку) может выйти из строя до strlen
, но оказывается, что char
является явным исключением из строкового сглаживания).
Но, насколько вероятно, что это не удастся на практике? Как минимум, я думаю, что после строки данных строкового литерала должно быть 3
байтов, malloc должен быть 4
-байт или больше (фактически на самом деле в большинстве систем), а malloc
необходимо выделить 3
дополнительные байты. Существуют другие критерии, связанные с псевдонимом. Все это прекрасно для реализаций компилятора, которые создают свои собственные среды, но как часто эти условия встречаются на современном оборудовании для кода пользователя?