2017-11-29 3 views
0

Ist es möglich, meine intelligente Zeiger-Rückgabe-Funktion mit SAL annotieren?SAL Annotationen: _Ret_maybenull_ für std :: shared_ptr

_Ret_maybenull_ std::shared_ptr<MyClass> getMyObject(); 

gibt mir die Warnung

Warnung C6504: Ungültige Anmerkung: 'Null' Eigenschaft nur auf Werte von Pointer verwendet werden können, Zeiger-to-Mitglied, ein Array oder Referenztyp: Funktion ' getMyObject 'zurück. Tatsächlicher Typ 'class std :: shared_ptr'.

und nicht eine einzige Warnung, wenn dieses Schreiben:

auto a = getMyObject(); 
a->foo(); 
+0

https://lastsector.wordpress.com/2013/09/08/when-c-meets-sal-annotations/ – PhilLab

Antwort

0

Genau wie diese Warnung sagt _Ret_maybenull_ kann nicht auf intelligente Zeiger aller Art angewendet werden, nur auf primitive Typen. Als Alternative könnte die Annotation für diese Funktion _Check_return_ und die Annotation für operator -> des intelligenten Zeigers sein (und andere Operatoren, die den gespeicherten Zeiger dereferenzieren) _Check_return_ _Ret_notnull_. Sie müssen möglicherweise Ihre eigenen Wrapper für intelligente Zeiger schreiben, um dies zu nutzen.

+0

Danke. Wie schade, dass wir vor einiger Zeit auf Smartpointer umgestiegen sind, um unsere Codebasis zu verbessern, und dass sie uns jetzt vor statischen Analysen bewahrt. Ich zögere, einen Wrapper um einen Wrapper für Zeiger zu schreiben, besonders da die Smart-Zeiger-Klassen von std viel besser getestet werden als etwas, das wir selbst schreiben würden. – PhilLab

+0

@PhilLab Dies sieht aus wie ein Job für öffentliche Implementierungsvererbung und 'using parent :: parent;' - dann können Sie 'operator->' mit Ihrem annotierten, das einfach weiterleitet, ausblenden. – Yakk

Verwandte Themen