Подтвердить что ты не робот

Выполнение strlen() в gcc

Может ли кто-нибудь указать мне на определение strlen() в GCC? Я был выпущен в июле 2005 года в формате 4.4.2 в течение полутора часов (в то время как Googling как сумасшедший), и я не могу найти, где strlen() фактически реализовано.

4b9b3361

Ответ 1

Вы должны искать в glibc, а не в GCC - это, по-видимому, определено в strlen.c - здесь ссылка на strlen.c для версии glibc 2.7... И вот ссылка на glibc SVN репозиторий онлайн для strlen.c.

Причина, по которой вы должны смотреть glibc, а не gcc:

Библиотека GNU C используется как библиотека C в системе GNU и большинстве систем с ядром Linux.

Ответ 2

Я понимаю, что этот вопрос составляет 4 года, но gcc часто будет включать свою собственную копию strlen, если вы не #include <string.h>, и ни один из ответов (включая принятый ответ) не отвечает за это. Если вы забудете, вы получите предупреждение:

file_name:line_number: warning: incompatible implicit declaration of built-in function 'strlen'

и gcc будет встраивать свою копию, которая на x86 является вариантом aspnb scasb asm, если вы не передадите -Werror или -fno-builtin. Файлы, связанные с этим, находятся в gcc/config/<platform>/<platform>.{c,md}

Он также контролируется gcc/builtins.c. В случае, если вы задавались вопросом, оптимизирован ли параметр strlen() для константы, см. Функцию, определенную как tree c_strlen(tree src, int only_value) в этом файле. Он также контролирует, как strlen (среди других) расширяется и складывается (на основе ранее упомянутой конфигурации/платформы)

Ответ 3

Здесь bsd реализация

size_t
strlen(const char *str)
{
        const char *s;

        for (s = str; *s; ++s)
                ;
        return (s - str);
}

Ответ 4

Это то, что вы ищете? источник strlen(). Дополнительную информацию см. В git репозиторий. Страница glibc resources содержит ссылки на репозитории git, если вы хотите их захватить, а не смотреть на веб-представление.

Ответ 5

Google Code Search является хорошей отправной точкой для таких вопросов. Обычно они указывают на различные источники и реализации функции.

В вашем конкретном случае: GoogleCodeSearch (strlen)

Поиск в Google Code полностью закрыт в марте 2013 года.

Ответ 6

Хотя исходный плакат, возможно, не знал этого или искал это, gcc внутренне строит ряд так называемых встроенных функций c, которые он определяет сам по себе, включая некоторые функции mem *() и ( в зависимости от версии gcc) strlen. В таких случаях версия библиотеки по существу никогда не используется, и указание человека на версию в glibc не является строго правильным. (Он делает это по соображениям производительности - в дополнение к улучшению, которое делает сама встраивание, gcc "знает" определенные вещи о функциях, когда он их предоставляет, например, что strlen является чистой функцией и что он может таким образом оптимизировать многократные вызовы или в случае функций mem *(), которые не имеют псевдонимов.)

Для получения дополнительной информации об этом см. http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

Ответ 7

Я понимаю, что это старый вопрос, вы можете найти источники ядра Linux в github здесь, а 32-разрядная реализация для strlen() можно найти в strlen_32.c в github. Указанный файл имеет эту реализацию.

#include <linux/types.h>
#include <linux/string.h>
#include <linux/module.h>

size_t strlen(const char *s)
{
    /* Get an aligned pointer. */
    const uintptr_t s_int = (uintptr_t) s;
    const uint32_t *p = (const uint32_t *)(s_int & -4);

    /* Read the first word, but force bytes before the string to be nonzero.
     * This expression works because we know shift counts are taken mod 32.
     */
    uint32_t v = *p | ((1 << (s_int << 3)) - 1);

    uint32_t bits;
    while ((bits = __insn_seqb(v, 0)) == 0)
        v = *++p;

    return ((const char *)p) + (__insn_ctz(bits) >> 3) - s;
}
EXPORT_SYMBOL(strlen);