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"); }
      
      











短所







別の戦闘ツール。



All Articles