Aikido

除算操作を行う前に除数を確認すべき理由

読みやすさ

ルール
チェック 除数 前に 除算 演算。
除算 による ゼロ  ランタイム クラッシュ および
必ず 防止 防止 明確に 明示的な チェックによって

サポート言語: 45+

はじめに

ゼロ除算はほとんどの言語で即時的な実行時エラーを引き起こし、アプリケーションを段階的な機能低下なしにクラッシュさせます。ユーザー入力、計算値、データベース結果のいずれからも予期せず除数ゼロが生成される可能性があります。エッジケースデータがエラーを誘発した場合、単一の未チェック除算操作が本番サービスを停止させる可能性があります。

なぜそれが重要なのか

システムの安定性: Java、C、Pythonなどの言語では、ゼロ除算によりアプリケーションが即座にクラッシュする可能性があります。本番環境では、これはリクエストの消失、トランザクションの中断、サービスの利用不能を意味します。JavaScriptでさえ、ゼロ除算が 無限 または NaNこれらの値は計算を通じて伝播し、誤った結果を引き起こします。

データ整合性:バッチ処理やデータパイプライン中に分割エラーが発生すると、クラッシュ前に部分的な結果が書き込まれる可能性があります。これによりデータが不整合な状態となり、手動での復旧が必要となるほか、完全なデータに依存する下流システムが破損する恐れがあります。

攻撃対象領域:攻撃者は意図的に除数を生成する入力を作成し、サービスをクラッシュさせることが可能です。除数を検証せずに計算を実行するAPIエンドポイントは、サービス拒否攻撃の媒介となります。単一の悪意あるリクエストでサービス全体を停止させることが可能です。

コード例

非準拠:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    return (conversions / visitors) * 100;
}

なぜそれが間違っているのか: 除数がゼロの場合、両方の関数がクラッシュする。 平均注文金額を計算する() 失敗する 注文数 は 0 であり、 conversionRateを計算する() 失敗する 訪問者 は0である。これらのシナリオは現実的である:新規事業には注文がゼロの場合があり、キャンペーンには訪問者がゼロの場合がある。

✅ 準拠:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    if (orderCount === 0) {
        return 0;
    }
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    if (visitors === 0) {
        return 0;
    }
    return (conversions / visitors) * 100;
}

これが重要な理由:明示的なチェックにより、ゼロ除算によるクラッシュを防止します。除算が不可能な場合、関数は適切なデフォルト値(ゼロ)を返します。エッジケースの入力があってもアプリケーションは動作を継続し、安定性と可用性を維持します。

結論

除算操作の前に必ず除数を検証してください。適切なデフォルト値を返す、説明的なエラーをスローする、またはビジネスロジックに基づいてゼロの場合を処理してください。特にユーザー入力や外部データの場合、除数がゼロでないことを決して仮定しないでください。

よくある質問

ご質問は?

負のゼロや浮動小数点の境界条件をチェックすべきでしょうか?

JavaScriptでは、-0 === 0 は真となるため、1回のチェックで両方を処理できます。JavaScriptはクラッシュせずにInfinityまたはNaNを返すため、アプリケーションで正確な数値計算が必要な場合は結果に対してこれらもチェックすべきです:if (!isFinite(result))。一部の領域では、浮動小数点演算における精度損失を避けるため、除数(ゼロに近い非常に小さい数値)の大きさをチェックする必要があります。

クラッシュせずに無限大を返す言語はどうでしょうか?

JavaScriptでは、ゼロ除算の場合、エラーではなく無限大が返されます。しかし、無限大は計算を通じて伝播し、予期しない結果を生む可能性があります。無限大の挙動に依存するのではなく、除数にゼロが含まれていないかを明示的にチェックし、適切に対処してください。

データベースクエリにおける除算をどのように処理すればよいですか?

データベースの挙動は異なる:PostgreSQLはゼロ除算でエラーを発生させる一方、MySQLはデフォルトでNULLを返す。データベースを横断した安全性を確保するにはNULLIFを使用:SELECT total / NULLIF(count, 0)はエラーではなくNULLを返す。あるいは明示的なCASE文を使用:CASE WHEN count = 0 THEN 0 ELSE total / count END。データベースレベルでのチェックは、特定のデータベースの挙動に関わらず問題を防止する。

今すぐ安全を確保しましょう

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。