ルール
検出 矛盾 または 不可能な 論理
コード が 条件 条件 後に
確認する 違反 違反された後、 あるいは 仮定する 州が
が 状態 不可能 与えられた その 制御 フロー。
サポート言語: 45+はじめに
矛盾したロジックは、以前の制御フローに基づいてすでに真または偽であることがわかっている条件をコードがチェックするときに発生します。これは、リファクタリング後に検証が再配置された場合、または開発者が既存の保証を理解せずに防御的なチェックを追加した場合に起こります。チェックする関数 if (user !== null) 呼び出し後 user.email 矛盾したロジックがあり、nullチェックが遅すぎます。これらの論理的な不可能性は、コードの構成におけるより深い問題、または各コードパスが何を保証するかについての理解不足を示しています。
なぜ重要なのか
Security implications: 誤った検証は、危険な安全の錯覚を生み出します。データがすでに使用された後にセキュリティチェックが行われる場合、攻撃者は検証が行われる前の期間をエクスプロイトできます。特権操作の実行後にユーザー権限を検証するコードは、実際の保護を提供せず、セキュリティに関する誤解を招くコメントに過ぎません。
コードの保守性:矛盾したロジックは、コードが開発者のメンタルモデルと一致していないことを示唆します。誰かが条件チェックが必要だと考えたが誤った場所に配置したか、あるいは関連するチェックを更新せずにコードがリファクタリングされたかのいずれかです。将来のメンテナーは、必要な場所に検証が存在することを信頼できず、実際の保証を理解するために関数全体をトレースすることを強いられます。
バグの兆候: 不可能な条件が単独で存在することは稀です。それらは、エラー処理の欠如、関数契約に関する誤った仮定、またはリファクタリングの失敗など、より深い問題を示唆しています。決して実行されないチェックは、この状態を防ぐべき別のチェックがどこか別の場所で欠落していることを意味することがよくあります。
コード例
❌ 非準拠:
function processOrder(order) {
if (!order) {
return { error: 'Order required' };
}
const total = order.items.reduce(
(sum, item) => sum + item.price,
0
);
if (order.items && order.items.length > 0) {
applyDiscount(order);
}
if (total < 0) {
throw new Error('Invalid total');
}
return { total, status: 'processed' };
}
誤っている理由: コードは呼び出します order.items.reduce() itemsが~の場合にクラッシュする null または undefined、その後アイテムが存在するかどうかを確認します。その total < 0 価格を合計する際にreduceが常に非負の値を返すため、このチェックも矛盾しています。
✅ 準拠済み:
function processOrder(order) {
if (!order || !order.items || order.items.length === 0) {
return { error: 'Valid order with items required' };
}
const hasInvalidPrice = order.items.some(
item => typeof item.price !== 'number' || item.price < 0
);
if (hasInvalidPrice) {
throw new Error('Invalid item prices');
}
const total = order.items.reduce(
(sum, item) => sum + item.price,
0
);
if (order.items.length >= 5) {
applyBulkDiscount(order);
}
return { total, status: 'processed' };
}
これが重要な理由:すべての検証はデータを使用する前に実行され、チェックは論理的な順序で行われ、条件は実際の要件を反映しています。関数は入力データを事前に検証し、冗長または矛盾するチェックなしに有効なデータを処理します。
まとめ
データの使用前に検証を配置し、使用後ではありません。防御的に見えるが、データがすでにアクセスまたは変更された後に現れる条件を確認してください。リファクタリングの際には、関数全体の論理的な一貫性を保つために、関連する検証を更新または削除してください。

