Неприємна помилка в Doxygen 1.8.11

Зазвичай я не поспішаю переповзати на нову версію Ubuntu і досі сиджу в Ubuntu Mate 16.04. І я не один такий, на роботі також 16.04 (тільки не Mate, а «звичайна», зі стільницею Unity).
І от на роботі ж і виловив помилку в Doxygen, який в убунті 16.04 стоїть версії 1.8.11. Заманулося отримати для перегляду дерева викликів, CALL_GRAPH і CALLER_GRAPH, щоб швидше ознайомитися зі структурою чужого коду. А отримав страшну кашу з довгими циклічними петлями викликів. Виявилося, що всі функції, прототипи яких описано в .h-файлі безпосередньо під inline-функцією, вважаються такими, що викликані з цієї inline-функції.
Мінімальний приклад, doxy-bug.{h,c}:

static inline foo(void) { }

void moo(void);
#include <doxy-bug.h>

void moo(void)
{
    foo();
}

Doxygen 1.8.11 генерує для inline-функції foo() такий граф викликів

Wrong call graph (doxygen 1.8.11)

а для moo() взагалі отакий:
Wrong call graph (doxygen 1.8.11)

Уявляєте, що я отримав на дереві з кількох каталогів і сотень функцій, а в h-файлах під inline-функцією може бути описано декілька прототипів, всі з яких стають «викликаними» з неї? Оскільки всі ці функції викликали ще у глибину на декілька рівнів статичні функції всередині своїх файлів, а вже ті викликали ці inline-операції, утворювалося багато довгих петель.

На щастя, у свіжій версії Doxygen 1.8.15 цю помилку виправлено. Все красиво:
Correct call graph (doxygen 1.8.15)

Переставлю тепер doxygen і на роботі, буде легше.

3 коментарі to “Неприємна помилка в Doxygen 1.8.11”

  1. dor сказав:

    Раптом захотілося отаке:

    .PS
    A: box "foo" fill 0.2; move;
    B: box "moo";
    arrow right at 1/4 <A.e,A.ne>;
    arrow left at 1/4 <B.w,B.sw>;
    .PE

    .PS
    A: box "moo" fill 0.2; move;
    B: box "foo"; move;
    C: box "moo";
    arrow right at 0 <A.e,A.ne>;
    arrow right at 1/3 <B.e,B.ne>;
    arrow left at 1/3 <C.w,C.sw>;
    .PE

    .PS
    A: box "moo" fill 0.2; move;
    B: box "foo";
    arrow right at 0 <A.e,A.ne>;
    .PE

    "
    " Make it:
    " groff -Tpdf -p test.roff > test.pdf
    "
    " Manual:
    " https://www.complang.tuwien.ac.at/doc/groff-base/html/pic.html

    Результат я сюди кинув: https://imgur.com/a/xRlWPTD

    • ReAl сказав:

      Я коли дуже хочу щось таке руками намалювати, то зазвичай користуюся тим же graphviz-ом, що й doxygen. Але цікаво знати, які є інші способи 🙂

      p.s. У doxygen-а ще одна схожа помилка вискочила, із вказівниками на функції. Ніколи було описати. Бага стара, я там у них додав коментар, що і в 1.18.15 вона досі живе. Ось як буде вільний час, то опишу. Якщо ще не пофіксили.

      • dor сказав:

        А я якось на цей pic/roff «як малювач діаграм» натрапив, то мене воно зачепило 🙂

        Тим, що «триста років тому», з 84-го року, я ще в школу ходив.

Leave a Reply

[flagcounter image]