Was ist der Zweck von __in __out __in_opt __allowed(), wie funktionieren sie? Sollte ich ähnliche Konstrukte in meinem eigenen Code verwenden?

Lesezeit: 3 Minuten

Einige dieser Präprozessordefinitionen befinden sich in der WinMain-Funktion und anderen Windows-Bibliotheksfunktionen. Was ist ihr Zweck? Wie arbeiten Sie? und ist es empfehlenswert, sie in Ihre Implementierungen oder Funktionsaufrufe zu schreiben?

Meine ersten Recherchen deuten darauf hin, dass sie einfach gleich aufgebaut sind wie:

#define __in 
#define __out
#define __in_opt

Das heißt, sie werden durch ersetzt nichts auf dem Präprozessordurchlauf. Sind sie nur eine Dokumentationsmethode ohne jegliche Funktionalität?

Wenn ja, sehe ich den Vorteil, den Code so zu dokumentieren. Bei so etwas wie doxygen müssen Sie die Parameternamen zweimal ausschreiben. Dies könnte also theoretisch dazu beitragen, Doppelarbeit zu reduzieren und die Konsistenz zu wahren …

Ich habe keine Theorie, wie __allowed() soll funktionieren.

Sie sind SAL-Annotationen in der Source-Code Annotation Language. Microsoft-Tools sind davon abhängig. Der Artikel der MSDN-Bibliothek ist hier. Ein gutes Beispiel ist Code-Analyse. Ein weiteres ziemlich unabhängiges Tool, das jedoch durch diese Anmerkungen unterstützt wird, ist der Pinvoke Interop Assistant.

  • Ist es nicht ein Problem, wenn die Tools von unzuverlässigen und falschen Informationen abhängen?

    – Prost und hth. – Alf

    21. November 2010 um 20:16 Uhr

  • Es ist immer ein Problem, wenn Tools von falschen Informationen abhängen. SAL-Anmerkungen sind nicht anders. Es ist natürlich etwas riskant, aber das ist der Deklarations-/Definitionsarchitektur von C inhärent – Sie müssen immer sicherstellen, dass sie übereinstimmen.

    – MSalter

    22. November 2010 um 10:29 Uhr

  • @Cheers SAL-Anmerkungen werden von der Codeanalyse sowohl für den Aufrufer als auch für den Aufgerufenen überprüft. Die Anmerkungen drücken nicht nur die Absicht des Autors aus, sondern werden (soweit möglich) auch überprüft. Als solche sind sie weder unzuverlässig noch falsch. In Betracht ziehen void foo( _In_opt_ int* p ) { *p = 42; }. Der Parameter p ist als optional gekennzeichnet, aber die Implementierung geht davon aus, dass es immer gültig ist. Die Codeanalyse identifiziert das Problem und stellt Diagnoseinformationen bereit.

    – Inspektionsfähig

    13. Juli 2013 um 12:14 Uhr

  • Korrektur zum obigen Codebeispiel, das sollte eher lauten: void foo( _In_opt_ int* p ) { int i = *p; } denn es ist ein _In_-Parameter.

    – Inspektionsfähig

    13. Juli 2013 um 12:29 Uhr

  • @Tim: Zum Beispiel, wie in meiner Antwort auf diese Frage ausgeführt, die Anmerkungen der Windows-API MessageBox Funktion sind einfach falsch (oder waren zum Zeitpunkt dieser Antwort falsch und waren schon sehr lange falsch). Die meisten Anmerkungen stammen von Microsoft und sind unzuverlässig. Dies kommt zu unnötigem Geschwätz / visueller Unordnung hinzu und ist kein Gewinn für C ++.

    – Prost und hth. – Alf

    19. Juli 2013 um 1:05 Uhr


SAL-Anmerkungen sind für zwei Dinge nützlich:

  • Statische Analyse durch PREfast (kompilieren mit /analyze)
  • Menschliche Leser können sich die Anmerkungen ansehen und herausfinden, wie eine Funktion aufgerufen werden sollte, und schnell die Eingabe-/Ausgabeparameter bestimmen.

Die Makros werden tatsächlich zu verschiedenen declspec-Ausdrücken erweitert, wenn Ihr Code mit aktivierter Analyse kompiliert wird. Ich verwende diese Anmerkungen ständig in meinem Code.

Sie werden in einem semantischen Analysetool von Microsoft als Code-Markups verwendet. Wenn Sie dieses Tool nicht selbst verwenden möchten, hat es wenig Sinn, es zu verwenden.

Diese Microsoft-Makros werden im Allgemeinen zu nichts erweitert und sind als Hinweise für den Leser gedacht.

Allerdings habe ich letztes Mal zB die Hintings auf der überprüft MessageBox Argumente war völlig falsch, was darauf hindeutet, dass das erste, zweite und dritte Argument nützliche Standardwerte hatte (wenn Sie 0 angeben), während in Wirklichkeit das erste und vierte Argument nützliche Standardwerte haben. Vielleicht auch das Titelargument, das standardmäßig “Error” lautet, aber ich habe das nie nützlich gefunden. Es ist also nur eine Sache von Microsoft, Hinweise, auf die Sie sich nicht verlassen können und sollten, nur irreführendes visuelles Durcheinander.

Prost & hth.,

1209780cookie-checkWas ist der Zweck von __in __out __in_opt __allowed(), wie funktionieren sie? Sollte ich ähnliche Konstrukte in meinem eigenen Code verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy