Goのメモリ安全性:スレッドセーフティの欠如がもたらす危険

2025-07-25

この記事は、Goにおけるメモリ安全性の一般的な理解に異議を唱えています。著者は、単純なメモリ安全性(例:境界外アクセス防止)は堅牢なプログラムにとって不十分であり、真の安全は未定義動作(UB)の回避にあると主張しています。Goプログラムの例を通して、`unsafe`操作を使わずとも、データ競合がUBとクラッシュを引き起こす可能性を示しています。著者は、Goのデータ競合処理が十分に厳格ではなく、メモリ安全性の主張と矛盾し、Goプログラムをセキュリティ脆弱性のリスクにさらしていると主張しています。結論として、言語の安全性は二元的ではなく、言語が提供する安全性の保証とトレードオフを理解することが重要であると強調しています。

続きを読む

ポインタは複雑だII:LLVM最適化における微妙なバグ

2025-02-02

この記事では、コンパイラの中間表現(IR)の正確なセマンティクス、特に、安全でないポインタ操作を許可するC、C++、Rustなどの言語における重要性について掘り下げています。著者は、一見正しい3つのLLVMコンパイラ最適化手順が、最終的なプログラムの動作を最初のプログラムの動作と矛盾させる可能性があることを示しています。根本原因はポインタの「来歴」(provenance)です。これは、ポインタがメモリアドレス以上の情報を持ち、その計算方法の詳細が含まれていることを意味します。そのため、未定義動作(UB)の正確な定義を含む、より正確なLLVM IR仕様が必要です。コンパイラIRを厳格な仕様を持つスタンドアロンのプログラミング言語として扱うことが、このような問題を解決する鍵となります。

続きを読む