私の意見では、このトピックは不当に無視されています。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>
簡単な使用ガイドが含まれています。
非常に簡単に、マクロ:
- _In_入力パラメーターへのリンク
- _Out_出力パラメーターへのリンク
- _In_z_行の末尾がゼロ
- _In_reads_(s)要素の配列
- _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"); }
短所
- マイクロソフトの仕様。
- 言語には2つのバージョンがあります
- Intellisense QtCreatorは関数宣言でマクロを受け入れません
- 広告が洗練されます
別の戦闘ツール。