説明
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も、範囲外のアクセスでは例外を発生させます。