3

私たちは Linux カーネル内でコードを書いているので、できる限り試してみましたが、PC-Lint/Flexelint を Linux カーネル コードで動作させることができませんでした。組み込みシンボルなどが多すぎます。しかし、それは副次的な問題です。

gcc から始めて、さまざまなコンパイラがありますが、その他のコンパイラもあります。彼らの警告オプションは時間の経過とともに強化されており、かなり強力な静的分析ツールでもあります.

捕まえたいのはこちら。はい、「マジック ナンバーがない」、「ビット シフトに注意する」など、コード レビューで見つけやすいいくつかの点に違反していることはわかっていますが、それはたまたまコードのそのセクションを見た場合に限られます。とにかく、ここにあります:

unsigned long long foo;
unsigned long bar;

[... lots of other code ...]

foo = ~(foo + (1<<bar));

さらに更新された問題の説明 - バーが 16 に制限されていても、まだ問題があります。明確にすると、問題は暗黙的な int 型の定数であり、計画外に、すべての計算が同じサイズと符号で実行されるという規則に違反する複雑な式になります。

問題: '1' は long long ではありませんが、小さな値の定数として、デフォルトで int になります。したがって、bar の実際の値がたとえば 16 を超えない場合でも、(1<<bar)式はオーバーフローし、計算全体が台無しになります。

おそらく正しい解決策: 代わりに 1ULL を書き込みます。

この (改訂された) 問題を指摘するよく知られたコンパイラとコンパイラの警告フラグはありますか?

4

1 に答える 1

1

この構造を疑わしいものとしてフラグを立てるために、あなたがどのような基準を考えているのかわかりません。barの値がintのサイズ(ビット単位)よりも大きい場合は明らかに問題がありますが、通常、コンパイラーはそれを認識しません。ヒューリスティックなバグ検出ツールの観点からは、可能性のあるバグを通常の構造から分離するための適切なパターンを持つことが、誤検知が多すぎる(ユーザーがツールを嫌い、ツールの使用を拒否する)ことを回避するための鍵となります。

私のURLのオープンソースツールは、タイプのサイズよりも大きい数の論理シフトにフラグを立てますが、これは主に重要な組み込みソフトウェアの検証ツールであり、Linuxで使用する場合は、それを適切に使用するために多くの作業が必要です。リンクされた構造とその他の問題を抱えたカーネル。

于 2009-07-16T20:06:25.733 に答える