Неприємна помилка в 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}:
void moo(void);
void moo(void)
{
foo();
}
Doxygen 1.8.11 генерує для inline-функції foo()
такий граф викликів
а для moo()
взагалі отакий:
Уявляєте, що я отримав на дереві з кількох каталогів і сотень функцій, а в h-файлах під inline-функцією може бути описано декілька прототипів, всі з яких стають «викликаними» з неї? Оскільки всі ці функції викликали ще у глибину на декілька рівнів статичні функції всередині своїх файлів, а вже ті викликали ці inline-операції, утворювалося багато довгих петель.
На щастя, у свіжій версії Doxygen 1.8.15 цю помилку виправлено. Все красиво:
Переставлю тепер doxygen і на роботі, буде легше.
Раптом захотілося отаке:
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
Я коли дуже хочу щось таке руками намалювати, то зазвичай користуюся тим же graphviz-ом, що й doxygen. Але цікаво знати, які є інші способи 🙂
p.s. У doxygen-а ще одна схожа помилка вискочила, із вказівниками на функції. Ніколи було описати. Бага стара, я там у них додав коментар, що і в 1.18.15 вона досі живе. Ось як буде вільний час, то опишу. Якщо ще не пофіксили.
А я якось на цей pic/roff «як малювач діаграм» натрапив, то мене воно зачепило 🙂
Тим, що «триста років тому», з 84-го року, я ще в школу ходив.