2017-03-29 5 views
2

私はカーネルで整数演算を行う必要があります。具体的には、デルタによってsize_tオブジェクトをインクリメントする必要があります。これはかなり頻繁に起こります。だから私は、カーネル内で可能な整数オーバーフローを防ぐ必要があるかどうか、もしそうなら、カーネルはこれに対してマクロまたはAPIを提供するのだろうかと思っていますか?カーネルの整数オーバーフロー - 可能ですか?

+2

'size_t'は符号なしで、unsignedオーバーフローは明確に定義されています。したがって、言語の観点からは、あなたは明確であり、' size_t'はそれ自体が悪影響を及ぼしません*。もちろん結果はラップされるので、コードのロジックはそれに対処できなければなりません。 –

答えて

1

size_tはオーバーフローしません。明確な「ラップアラウンド」セマンティクスを持つ、符号なしの型です。 size_tの最高値をインクリメントすると、 がゼロになります。

size_tの特定のケースでは、size_tの簡単な操作では、2つのサイズを加算するのと同じように、結果のオペランドが2つのソースオペランドのいずれよりも大きいかどうかをチェックするだけで十分です。 (size3 = size1 + size2) < size1)の場合、ラップがあります。

"ホイール"を囲むクロック値として符号なしの型を使用する場合、「時間の前」計算を正しく行うためのマクロがあります。たとえば、時刻0xFFFFFFFEを過去w.r.tの数時間単位として扱いたいとします。 0x00000003。カーネルで "jiffies"時間を使用している場合は、time_beforeインライン関数とそのファミリの他の関数を使用できます。 (longとして表される「古典的なjiffies」(私の言葉)とu64として表される64ビットのjiffyがあり、time_beforetime_before64のような別々の関数があることに注意してください。

しかし、オーバーフローチェックで数学を行うための一般的なマクロはありますか?私が自分の都合で持っているカーネルツリー(3.18.31)を偶然コーミングすると、そのようには見えません。 includeサブツリーのgrep -i overflowには、fsのようなコード領域で何も検索されず、同様の検索がアドホックのローカルコードオーバーフローチェックの使用を明らかにします。それは本当に残念です。 「これら2つの値を合計すると、問題がある」という問題は、誰もがちょうどaddv(x_int, y_int, &overflow_flag)などのように使うことができる解決策が存在するほど一般的であるという問題があると思います。

1

カーネルの整数オーバーフローが可能ですか?

はい。それは重要ではありませんが、ユーザー空間やカーネルはCPUの仕組みに過ぎません。 [はい] - 私はあなたがそれはあなたのケースでそれが受け入れられないです起こることができると思われる場合は、カーネル

で可能な整数オーバーフローを防ぐために必要がある場合

私は思ったんだけど。符号付き整数の場合は、undefined behaviorにもなります。

は、カーネルがこの

いいえ、カーネルにはすぐに使用できる機能は、整数オーバーフローを扱うために存在しないためのマクロやAPIを提供します。さて、オーバーフロー検出のためにGCC wrappersがいくつかあります...しかし、それを使用しないでください。そうでなければ、Linus Torvaldsが来て、hereのように叫ぶでしょう:)

とにかく、本当に必要なときに整数オーバーフローを手動で検出するのは簡単です。例えばhereを見てください。あなたのケースでは、size_tは符号なしなので、またはをラップされた値(details)をラップしないようにする必要があります。

関連する問題