LINUX.ORG.RU

Неиспользуемые функции в си-проекте

 ,


0

2

Есть какая-нибудь тулза чтобы показать что ххх() не используется в проекте?

Уточнение - проект с кастомными скриптами сборки, около 100 файлов.

★★★★★

Последнее исправление: PPP328 (всего исправлений: 1)

Я использую gcov. При прогонке тестов неиспользуемый код видно сразу.

Deleted
()
Ответ на: комментарий от Iron_Bug

Нет под рукой компилятора чтобы проверить, но насколько я помню — только в случае со static. Функцию из другого модуля, которая смотрит наружу, он не показывает.

Deleted
()
Ответ на: комментарий от Deleted

Да, вы правы. -Wall включает в себя -Wunused-function, который показывает только static.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

gcov использовать не выйдет, только static тулы, ибо код выполняется не на машине на которой его пишут. Там сложное окружение, завязанное на базы данных и скрипты. Плюс нельзя покрыть все автотестами, ибо много функционала и зачастую он одноразовый (типа fire alarm).

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

ну так в динамических библиотеках и нет понятия «неиспользуемая функция». просто есть интерфейс, а использовать все функции или только одну - это дело хозяйское.

Iron_Bug ★★★★★
()
Ответ на: комментарий от PPP328

У clang static analyzer есть проверки для поиска неиспользуемого кода.

Ещё одна альтернатива — использовать что-то на основе gtags, предположительно простым скриптом вопрос решится. Это если совсем собирать с чем-то другим не получается.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

в этом треде не хватает упоминания пва клея pvc studio

Deleted
()
Ответ на: комментарий от Deleted

в си нет «модулей». есть объектники, статические библиотеки и динамические библиотеки. при компиляции в одном бинарнике компилятор выдаст предупреждение.

Iron_Bug ★★★★★
()

-Weverything

anonymous
()
Ответ на: комментарий от anonymous

разве в СИ есть модули?

Явно стандартом не определяются. По факту модули организуются отдельными файлами, где интерфейс обьявляют в заголовочный файл, а все внутренние функции объявляют static.

Deleted
()
Ответ на: комментарий от Deleted

Ты что такое «модуль» в контексте Си вообще знаешь?

a % m

anonymous
()
Ответ на: комментарий от Iron_Bug

при компиляции в одном бинарнике компилятор выдаст предупреждение

Тебе же выше уже написал PPP328, что это не так.

Deleted
()

На выходе набор объектных файлов без библиотек? Я писал себе скрипт на питоне, который показывает неиспользуемые функции, но с библиотеками не использовал. Могу выложить, если интересно.

xaizek ★★★★★
()

Если есть возможность вмешаться в сборку, можно попробовать так:

  • компилируем все с -fdata-sections -ffunction-sections
  • линкуем бинарник с -Wl,--gc-sections
  • получаем список всех символов: $ find . -name "*\.o" | xargs nm | grep " T " | cut -c 20- | sort > all-symbols
  • получаем список символов из бинарника (в предположении что линкер вырезал неиспользуемые) $ nm ./a.out | grep " T " | cut -c 20- | sort > used-symbols
  • diff all-symbols used-symbols
Deleted
()
Ответ на: комментарий от Deleted

У ld есть --print-gc-sections, может его проще будет использовать для получения удалённых символов? Не знаю, насколько вывод этой опции читабельный.

xaizek ★★★★★
()

cppcheck.

Только что проверил. Версия 1.83 отсюда http://cppcheck.sourceforge.net/

Добавил такой код:

// в hpp файле
void unused();
// в сpp файле
void unused()
{

}
Вот такой вывод даёт cppcheck:
имя_файла.cpp стиль строка 27 The function 'unused' is never used.
Так что используй cppcheck.

P.S прогнал теже файлы PVS-Studio

Congratulations! PVS-Studio has not found any issues in your source code!

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

cpp-check у нас не показывает такое, версия 1.78 dev. pvs - говно, ложноположительного 95%, оставшиеся 5% показывает cppcheck.

Ща попробую собрать cpp-check последний. С cppcheck всегда были проблемы с тем что он не видит cfg файлы.

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от PPP328

Это легко починить.

Скопируй папки cfg/ и platforms/ со всеми файлами в папку gui/

Или использовать собранные файлы с сайта, тогда ничего мутить не нужно...

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Короче поставил новый cppcheck - он стал хуже в плане развертывания макросов. Но функции показывает, спасибо.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от andreyu

cppcheck такое не находит.

Хотя cppcheck ругается прям на эту строчку, только с другим предупреждением

v[10] = 10;
Variable 'v' is assigned a value that is never used.

Анализатор от Microsoft ругается на все [], и говорит использовать вместо [] функцию at

Prefer to use at() instead of unchecked subscript operator

PVS-Studio

V557 Array overrun is possible. The '10' index is pointing beyond array bound.

Clang-tidy, ничего не нашёл...

$ cat 1.cpp
#include <vector>
int main()
{
  std::vector<int> v(10);
  v[10] = 10;
  return 0;
}
$ clang-tidy -checks=* 1.cpp -- -std=c++1z
1404 warnings generated.
Suppressed 1404 warnings (1404 in non-user code).

fsb4000 ★★★★★
()
Ответ на: комментарий от andreyu

А причем тут векторы, если в тегах Си?

pvs - это 99.99% ложных срабатываний:

typedef struct CML_Node
{
    char * name;
    u32    type;

    union
    {
        char  * string;
        i32     integer;
    } data;

    struct CML_Node ** nodes;
           u32    ncount;

    struct CML_Node * parent;
} CML_Node;

bool cml_equal(CML_Node * n1, CML_Node * n2)
{
    if (n1 == n2)
        return true;
    if (((!n1) && (n2)) ||
        ((!n2) && (n1)))
        return false;

    if (n1->type != n2->type)
        return false;

    if (bxi_strcmp(n1->name, n2->name))
        return false;

    switch (n1->type)
    {
    case CML_TYPE_INTEGER:
        if (n1->data.integer != n2->data.integer)
            return false;
        break;
    case CML_TYPE_STRING:
        if (bxi_strcmp(n1->data.string, n2->data.string))
            return false;
        break;
    case CML_TYPE_ARRAY:
    case CML_TYPE_HASH:
    {
        u32 i;
        if (n1->ncount != n2->ncount)
            return false;
        for (i = 0; i < n1->ncount; i++)
            if (!cml_equal(n1->nodes[i], n2->nodes[i]))
                return false;
        break;
    }
    default:
        break;
    }

    return true;
}
Десятки срабатываний.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от fsb4000

cppcheck такое не находит.

Я знаю. Потому и считаю его бесполезным инструментом.

andreyu ★★★★★
()
Ответ на: комментарий от PPP328

А причем тут векторы, если в тегах Си?

Ну имя инструмента cppcheck как бы намекает. Но попробуйте заменить вектор на не очень хитрую структуру.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.