Aikido

除算操作を実行する前に除数をチェックすべき理由

可読性

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

サポート言語: 45+

はじめに

ほとんどの言語において、ゼロ除算は即座にランタイムエラーを引き起こし、グレースフルデグラデーションなしにアプリケーションをクラッシュさせます。ユーザー入力、計算値、またはデータベースの結果はすべて、予期せずゼロ除数を生成する可能性があります。単一の未チェックの除算操作が、エッジケースデータによってエラーがトリガーされた際に、本番サービスを停止させる可能性があります。

なぜ重要なのか

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

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

アタックサーフェス:攻撃者は、意図的にゼロ除算を引き起こす入力を作成し、サービスをクラッシュさせる可能性があります。除数を検証せずに計算を実行するAPIエンドポイントは、サービス拒否攻撃のベクトルとなります。たった1つの悪意のあるリクエストで、サービス全体が停止する可能性があります。

コード例

❌ 非準拠:

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

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

誤っている理由: 除数がゼロの場合、両方の関数がクラッシュします。 calculateAverageOrderValue() ~の場合に失敗します orderCount は0であり、 calculateConversionRate() ~の場合に失敗します 訪問者 は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)))。一部のドメインでは、浮動小数点演算での精度損失を避けるために、除数の大きさ(ゼロに近い非常に小さな数)をチェックする必要があります。

クラッシュする代わりにInfinityを返す言語についてはどうですか?

JavaScriptでは、ゼロ除算に対してエラーではなくInfinityが返されます。しかし、Infinityは計算を通じて伝播し、予期せぬ結果を生み出すことがあります。Infinityの挙動に依存するのではなく、ゼロ除算を明示的にチェックし、適切に処理してください。

データベースクエリでの除算をどのように処理しますか?

データベースの挙動は様々です。PostgreSQLはゼロ除算でエラーをスローしますが、MySQLはデフォルトでNULLを返します。データベース間で安全性を確保するには、NULLIFを使用してください。例えば、SELECT total / NULLIF(count, 0) はエラーの代わりにNULLを返します。あるいは、明示的なCASE文を使用することもできます。例: CASE WHEN count = 0 THEN 0 ELSE total / count END。データベースレベルのチェックは、特定のデータベースの挙動に関わらず問題を防止します。

今すぐ、安全な環境へ。

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

クレジットカードは不要です | スキャン結果は32秒で表示されます。