Forum: PC-Programmierung Doxygen Eigentümlichkeiten / Fragen


von Nick M. (Gast)


Lesenswert?

Hi!

Ich hab jetzt ca. 50 kLOC C-code doxygenifiziert, war nicht sooo 
schlimm.
Es gibt aber paar Eigentümlichkeiten für die ich keine Lösung finde.
Ein Bespiel:
1
if (APP_FI2FOInitialize(pLTT->destInstance - 1, taskBox, appData.myMail, appData.mailCard))
2
  APP_DynamicTasksTaskInstanceAdd(APP_FI2FOTasks, pLTT->destInstance - 1, taskBox, false);

Doxygen erkennt nicht, dass die Funktion APP_FI2FOInitialize (die ein 
bool zurückliefert) aufgerufen wird.
In der Doxy-Doku erscheint die Funktion richtig, aber es gibt angeblich 
keine Caller dafür (Ja, call-tree ist eingschalten, geht ja auch wo 
anders richtig).

Zweites Problem (aber da kann Doxygen wohl nichts dafür) ist, dass nicht 
erkannt wird, dass die Funktion APP_FI2FOTasks verwendet wird. In 
APP_DynamicTasksTaskInstanceAdd wird die Funktion in eine Tabelle 
eingetragen und aus der Tabelle zyklisch aufgerufen.
Wie kann ich Doxygen davon überzeugen, dass die Funktion verwendet wird?

Und last but not least:
In der Initialisierung der Applikation wird ein Haufen von weiteren 
Initialisierungen aufgerufen. Nur die ersten 12 werden angezeigt, der 
Rest (etwa 20) taucht nicht auf. Weder in im caller-Graphen der 
Funktion, noch im call-Graphen.
Im source sehe ich keinen Grund warum Doxygen plötzlich aufhören sollte 
weiterzumachen.

Warnings hab ich etwa 25, die betreffen aber nicht die Teile. Sind von 
Sources aus der Bibliothek und daran ändere ich nichts daran.
C-source ist eingeschalten, mit clang wird es nur schlimmer.
Version ist 1.8.17 unter Windows (mit Doxywizard).

Würd mich über Hinweise freuen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bezüglich des ersten Problems: irgendein #ifdef ist nicht aus Versehen 
da drumrum geklammert?

Was uns bei #ifdefs immer geholfen hat:
1
#if defined(SOME_FEATURE_MACRO) || defined(DOXYGEN)

Dann im Doxyfile -DDOXYGEN mit angeben.

Bezüglich des zweiten Problems (hört nach N Funktionsaufrufen auf) habe 
ich gar keine Idee.

von Nick M. (Gast)


Lesenswert?

Jörg W. schrieb:
> Bezüglich des ersten Problems: irgendein #ifdef ist nicht aus Versehen
> da drumrum geklammert?

Nein, leider nicht. Ich kann den Punkt wo er aufhört die 
Funktionsaufrufe zu erkennen gut sehen. Kommentare die Doxygen irgendwie 
falsch verstehen könnte hab ich rausgenommen. Ändert nichts.


Jörg W. schrieb:
> Was uns bei #ifdefs immer geholfen hat:
Ja, danke, das mit dem #if defined() ... hab ich gefunden und mach ich 
auch so.

Aber in dem Abschnitt ist echt nichts drinnen das mit #define 
ausgeklammert wird. Das würde ich auch im Editor sehen, der macht den 
Quelltext dann grau.

Doxygen erkennt auch keine Funktionsaufrufe in Parametern von snprintf. 
Find ich sehr seltsam.

von Michael Gugelhupf (Gast)


Lesenswert?

Verschwinden die Probleme irgendwann wenn du den Source-Code 
schrittweise bis auf die Problemstellen kürzt?

von Nick M. (Gast)


Lesenswert?

Michael Gugelhupf schrieb:
> Verschwinden die Probleme irgendwann wenn du den Source-Code
> schrittweise bis auf die Problemstellen kürzt?

***PATSCH***
Da hätte ich ja wirklich selber drauf kommen müssen. 8-/

OK, es ist eine einzige Zeile:
1
  APP_BSPPowerFail = 0;

und das ist definiert als:
1
volatile static int APP_BSPPowerFail = 0;
<Schaem level"max">aber in einem header-file</Schaem>

Hat das Doxygen also auch einen Nebennutzen!

Die restlichen Sachen schau ich mir noch an, die Sucherei hat etwas 
gedauert ...

Ich melde mich wieder und danke ALLEN antwortenden.

von Nick M. (Gast)


Lesenswert?

Aaalso ...

Die call-Graphs und caller-Graphs sind weitaus besser.
Auch die Funktionen die in einem array geladed sind (APP_FI2FOTasks im 
Bespiel) tauchen jetzt im caller-Graph auf!

Was aber immer noch nicht geht sind Funktionsaufrufe im snprintf.
Z.B.
1
  snprintf(buffer, bufferSz, "Temp: %3.1f degC\n", APP_ADCValueGet(ADC3));

Findet Doxygen die nicht, weil es das snprinf nicht weiter analysiert? 
Ich hab stdio.h natürlich nicht in den zu untersuchenden Verzeichnissen 
angegeben.

Aber, ich bin schon mal deutlich zufriedener mit dem Ergebnis.

von Nick M. (Gast)


Lesenswert?

So, ich bin nochmal über etwas "tolles" gestolpert:
1
  if (pL1Node->tag.symbol == APP_SymPut) {

Nach der Zeile hat Doxygen sang und klanglos aufgehört die Funktion 
weiter zu untersuchen.
Wenn ich das durch "if (false) {" ersetzt hab, hat Doxy weitergemacht.
APP_SymPut ist ein enum. Und der enum hatte keinen Kommentar (der wäre 
dann "sinnvollerweise 'Put' gewesen.
Nachdem ich einen Kommentar dahinter geschrieben hab, hat alles 
funktioniert.
Ich find das alles andere als sinnvoll und einleuchtend!

Wie gesagt, kein warning, kein error. Einfach in der Funktion abbrechen.


Das nur so als Hinweis.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nick M. schrieb:

> Ich find das alles andere als sinnvoll und einleuchtend!

Ist es gewiss.

Doxygen ist leider über die Jahre ziemlich komplex geworden, was wohl 
auch zu einigen versteckten Bugs geführt hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.