私はカーネルで整数演算を行う必要があります。具体的には、デルタによってsize_t
オブジェクトをインクリメントする必要があります。これはかなり頻繁に起こります。だから私は、カーネル内で可能な整数オーバーフローを防ぐ必要があるかどうか、もしそうなら、カーネルはこれに対してマクロまたはAPIを提供するのだろうかと思っていますか?カーネルの整数オーバーフロー - 可能ですか?
答えて
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_before
対time_before64
のような別々の関数があることに注意してください。
しかし、オーバーフローチェックで数学を行うための一般的なマクロはありますか?私が自分の都合で持っているカーネルツリー(3.18.31)を偶然コーミングすると、そのようには見えません。 include
サブツリーのgrep -i overflow
には、fs
のようなコード領域で何も検索されず、同様の検索がアドホックのローカルコードオーバーフローチェックの使用を明らかにします。それは本当に残念です。 「これら2つの値を合計すると、問題がある」という問題は、誰もがちょうどaddv(x_int, y_int, &overflow_flag)
などのように使うことができる解決策が存在するほど一般的であるという問題があると思います。
カーネルの整数オーバーフローが可能ですか?
はい。それは重要ではありませんが、ユーザー空間やカーネルはCPUの仕組みに過ぎません。 [はい] - 私はあなたがそれはあなたのケースでとそれが受け入れられないです起こることができると思われる場合は、カーネル
で可能な整数オーバーフローを防ぐために必要がある場合
私は思ったんだけど。符号付き整数の場合は、undefined behaviorにもなります。
は、カーネルがこの
いいえ、カーネルにはすぐに使用できる機能は、整数オーバーフローを扱うために存在しないためのマクロやAPIを提供します。さて、オーバーフロー検出のためにGCC wrappersがいくつかあります...しかし、それを使用しないでください。そうでなければ、Linus Torvaldsが来て、hereのように叫ぶでしょう:)
とにかく、本当に必要なときに整数オーバーフローを手動で検出するのは簡単です。例えばhereを見てください。あなたのケースでは、
size_t
は符号なしなので、またはをラップされた値(details)をラップしないようにする必要があります。
- 1. 整数オーバーフロー/アンダーフロー
- 2. エイダ:整数オーバーフロー
- 3. 整数オーバーフロー
- 4. アレイインデックスの整数オーバーフロー
- 5. Pythonで整数がオーバーフローしますか?
- 6. 整数のみ入力可能です
- 7. iPhone:式の整数オーバーフロー
- 8. GLSL(OpenGL ES2)で「整数定数オーバーフロー」
- 9. 整数のオーバーフローを検出する
- 10. CUDAカーネルに定数整数を渡す
- 11. すべての整数は可能な年の値ですか?
- 12. 整数のオーバーフローを検出する
- 13. Jqueryソート可能、divオーバーフロー不可
- 14. 整数型の分割 - 結果は予測可能ですか?
- 15. css - オーバーフローで水平スクロールが可能
- 16. C++の整数オーバーフローはどれほど悲惨ですか?
- 17. 第1列divのオーバーフロー隠しベースが可能ですか?
- 18. 型を整数にマップすることは可能ですか?
- 19. 可能なPythonの整数オーバーフローエラー
- 20. スイフトのARCオーバーフローの可能性?
- 21. 複数のgpusでcudaカーネルを実行することは可能です
- 22. カスタムWordN整数を作ることは可能ですか?
- 23. 固定子を持つオーバーフロー親コンテナは可能ですか?
- 24. If()関数で異なるnull可能な整数のデフォルト値
- 25. なぜこの乗算に整数オーバーフローがありますか?
- 26. 累乗剰余演算関数の整数オーバーフロー
- 27. Clojureで整数オーバーフローが発生していませんか?
- 28. jQueryドラッグ可能なオーバーフロー:自動発行
- 29. ユニバーサルハッシュの実装で整数オーバーフローが発生する
- 30. テンプレートクラスのときにenumで整数オーバーフローが発生する
'size_t'は符号なしで、unsignedオーバーフローは明確に定義されています。したがって、言語の観点からは、あなたは明確であり、' size_t'はそれ自体が悪影響を及ぼしません*。もちろん結果はラップされるので、コードのロジックはそれに対処できなければなりません。 –