SAL。 Microsoftの契約プログラミングまたは静的アナライザーの支援方法

ソースコード注釈言語(SAL)。
私の意見では、このトピックは不当に無視されています。RuNetには言及されていません。
静的アナライザーはあなたを助けません。

この記事は、自分自身や他者を信頼していないプログラマーを対象としています。
静的アナライザーを使用している、または使用しようとしている人々。

先史時代


POS端末。 5万 行。 10年の歴史。 最新のコンパイラーを知らなかった純粋な「C」。 そして、私はすべて白人です。
何かに入る前に、後部を固定する必要があります。
1.可能な限りアラートを除去します。
2.静的アナライザー(MSVC2010、PVS-Studio、MSVC2013)によるコード分析。

メリットはありましたが、静的アナライザーの機能は限られています。
memcpyの単純なラッパーは、アナライザーの労力を無効にし、ユニークなネポイミ(受信/送信機能の数)について話す必要はありません。
静的な保証(それが可能であることを夢見ている)コードセキュリティが必要です。

そして、興味を持ちました。標準のMicrosoftライブラリのマクロを使用することは可能ですか。

void * memcpy( _Out_writes_bytes_all_(count) void *dest, _In_reads_bytes_(count) const void *src, size_t count ); 

それは可能であり、必要でさえあることが判明しました。

なぜ


ソースコード注釈言語(SAL)により、アナライザーは有効な入力/出力パラメーター値を指定できます。 その後、アナライザはセキュリティ違反の可能性を通知します。

最も単純な例には、2つのエラーと解決策が含まれています。

 //   void func (_Out_writes_z_(9) char * str) { strcpy(str, "20141201XXXXXX"); } void main() { char str[5]; //   func (str); } 


使用する


使用は非常に一般的です。
Microsoftヘルプには、この主題に関する包括的な情報が含まれています。msdn.microsoft.com / en-us / library / hh916382.aspx
#include <sal.h>
簡単な使用ガイドが含まれています。

非常に簡単に、マクロ:

  1. _In_入力パラメーターへのリンク
  2. _Out_出力パラメーターへのリンク
  3. _In_z_行の末尾がゼロ
  4. _In_reads_(s)要素の配列
  5. _Out_writes_z_(s)ゼロで終わる文字列のサイズ「s」の配列

などなど。

ネタバレ見出し
 void func( _In_ int * v1, _In_z_ char * s, _In_reads_(m_len) char * m, int m_len, _Out_writes_z_(so), int so_len) { *v1; strlen(s); m[m_len - 1]; strncpy(so, so_len, " 234234234"); } 




短所




別の戦闘ツール。

Source: https://habr.com/ru/post/J248025/


All Articles