廃止されたBufferのnoAssert引数の使用

廃止されたBufferのnoAssert引数の使用

説明

Node.js 10で、Bufferの数値読み書きAPIからnoAssert引数が削除されました。現在のNode.jsで余分なtrueを渡しても境界チェックは無効にならず、この呼び出し方だけでバッファーオーバーフローが起こるわけではありません。現在のAPIシグネチャにない引数を渡すコード品質上の問題(CWE-685)であり、メソッド自体は引き続き有効です。

想定される影響

  • 廃止された引数で境界チェックを制御できると誤解し、レビューや保守が難しくなる可能性があります。
  • Node.js 10より前の環境と現在の環境で、意図した動作に違いが生じる可能性があります。

対処方法

  • noAssertを省略し、現在のBuffer APIシグネチャを使ってください。
  • 呼び出し前にオフセットと長さを検証してください。
  • Node.js 10より前の環境に対応する必要がある場合は、動作の違いを別途文書化してください。

例

変更前

javascript
const buf = Buffer.alloc(8);
// 現在のNode.jsでは削除されて意味のない第3引数
buf.writeInt32LE(1234, 0, true);

変更後

javascript
const buf = Buffer.alloc(8);
const offset = 0;
if (offset < 0 || offset + 4 > buf.length) {
  throw new RangeError('invalid buffer offset');
}
buf.writeInt32LE(1234, offset);

変更前は、境界チェックを制御しなくなった引数を渡しています。変更後は現在のシグネチャを使い、オフセットの範囲も明示的に確認します。現在のBuffer APIも、範囲外のアクセスでは例外を発生させます。

参考資料