Qiita 7 - キータぞ、来たぞ、キータだぞー (768レス)
上下前次1-新
307: 2025/10/13(月)22:59 ID:CEh/Jf9d(1) AAS
> 配列アクセスでの範囲チェックはメモリ安全性の一つであり必須事項
オーバーフローチェックをやんなくて良い理由なんてないし。
> コンパイラが範囲内であると判断できれば最適化で安全にチェックをなくすことが可能
それはオーバーフローチェックも同様。>>275のコードなんてコンパイル時にオーバーフローするか判定できるわけだし。
308(1): 2025/10/13(月)23:06 ID:KxydRFf5(1) AAS
>配列アクセスでの範囲チェックはメモリ安全性の一つであり必須事項
プログラムが完璧に作られてれば範囲チェックなんて要らんぞ?何言ってんの??
309: 2025/10/13(月)23:21 ID:cZNgUw0p(1) AAS
>>308
本気で言ってるのかね?
範囲外アクセスでどれだけ多くのセキュリティホールを招いてきているか
310: 2025/10/13(月)23:38 ID:xSeTVBuE(1) AAS
配列などのメモリ範囲外アクセスチェックは必ずしなければならない。
その上でコンパイラが範囲内だと保証できれば最適化により範囲内チェックを省略する。
ミスを起こし得る人間がそれを判断してはいけない。
311(1): 2025/10/14(火)00:00 ID:EH8FowVD(1) AAS
Cで配列などのメモリ範囲外アクセスチェックは必ずするかと言ったらしないよね?
「必ず」というのはそれを必ずするライブラリを使うということで
フリーの配列ライブラリなんてないよね?
配列ライブラリを使うならRustでいいと
312: 2025/10/14(火)00:04 ID:a2UJ2nPa(1) AAS
>>311
そのためにC/C++は大量のセキュリティホールを生み出してきた
そんなことは許されない時代になった
C/C++はそれ以外にも多くの未定義動作など問題が多すぎるため使うべきではない
313: 2025/10/14(火)00:14 ID:lAetg0vq(1) AAS
「ソフトウェアはメモリ安全でなければならない」との声明を発表、米ホワイトハウス:「C」「C++」よりも「Rust」などの言語を推奨
外部リンク[html]:atmarkit.itmedia.co.jp
米国ホワイトハウスが開発者に対しC++やC言語からRustやJavaなどのメモリ安全性に優れたプログラミング言語への移行を勧める
外部リンク:gigazine.net
314: 2025/10/14(火)00:14 ID:sCKwxfM0(1) AAS
配列アクセスでの範囲チェックは絶対必要だけどオーバーフローチェックはやんなくていいって言ってる人の頭の中ってどうなってるのかな?
オーバーフローに関してだけはプログラムが完璧に作られてるからありえないって思想?
315: 2025/10/14(火)00:26 ID:JKaSUvhP(1) AAS
実際の利用で最も多いシーケンシャルアクセスはインデックスの範囲チェックを消すことができる
for (i=start; i<end; i++) { a[i]利用 }
これはループ内でiの終端チェックとa[i]の範囲チェックの2回起きる
for (p=&a[start]; p<&a[end]; p++) { *p利用 }
このように書くかもしくはコンパイラが取り扱うと
ループ内でpの終端チェックのみになる
しかし人間が行なうとミスが入り込む余地があるため好ましくない
Rustなどはこれを抽象的なイテレータとして提供していて抽象化とメモリ安全性と実行効率の三つを両立させている
316(5): 2025/10/14(火)01:29 ID:QdU4k/SE(1) AAS
配列は静的メモリ確保なのに動的メモリ確保とごっちゃになっている素人w
317(1): 2025/10/14(火)01:39 ID:gE5nGyvL(1) AAS
>>316
言語によって細かい区別や呼び方から実装方法まで様々に異なるため
こういう時に皆は抽象的に代表名として配列と呼んでいるだけだよ
その意味での配列を静的メモリ領域に置くこともあればスタック領域に動的に置くこともあればビープ領域に動的に置くこともある
そして静的であろうと動的であろうと場所がどこであろうと範囲チェックは必要
318: 2025/10/14(火)05:15 ID:vZAfdOxe(1) AAS
>>316
配列を必ず静的に確保する言語はレア
多くの言語は配列を宣言する位置によって動的確保がある
例えばC言語は関数内で配列を宣言すると関数呼び出しするたびに動的に配列を含めたローカル変数の領域がスタック上に自動的に確保される
静的確保ではなく動的確保であるからこそ関数の再帰呼び出しが可能になっている
319: 2025/10/14(火)07:20 ID:dimV1O2B(1) AAS
くっだらねえ
320(2): 2025/10/14(火)15:07 ID:vn+4DI+D(1) AAS
>>316
静的メモリ確保の意味を理解できてないだろ
Cならグローバル変数とstatic変数が静的メモリ領域に確保される
配列もグローバル変数かstatic変数にした時のみ静的メモリ確保
そうでない普通の関数内の配列は動的メモリ確保
321(2): 2025/10/14(火)20:36 ID:2xWEVdNj(1) AAS
>>320
CやRustだと「普通の関数内の配列」にはスタックに置かれるものもあるんですが
要素数はコンパイル時に決まってる必要はあるけど
322: 2025/10/14(火)21:04 ID:ZulSE3F6(1) AAS
>>321
違いは簡単
静的メモリ配置 ←アドレス固定
動的メモリ配置 ←アドレス変動
static宣言すると静的にメモリ領域が確保されてアドレスが固定になる
実例コード
void foo() {
static int a1[] = {1, 2, 3};
int a2[] = {1, 2, 3};
printf("アドレス固定 a1: %p\n", &a1);
省10
323: 2025/10/15(水)01:32 ID:F/Bk7x58(1) AAS
>>316
>>321
staticの意味は「静的な」
staticを付けないと動的に毎回確保されることくらい分かりそうなものだが
324(1): 2025/10/15(水)02:42 ID:tBMKGpTr(1) AAS
なんてことだstatic宣言した変数が共有ライブラリの中だとアドレスが変わることがあるゾ!
325: 2025/10/15(水)02:49 ID:LnEbzNuN(1) AAS
>>324
リンク時に変わることはあっても
実行中にアドレスが変わることはない
326: 2025/10/15(水)18:27 ID:V1g0382z(1) AAS
cの静的動的はサイズが実行時に定まるか否かってことじゃないん?
staticかどうかはcプログラマにとっては別の感心事で
メモリの動静を語るときはそうだったと思うけど
俺の知ってる限り
staticつけてないローカルな配列のことを動的な確保って言ってる人見たこと無いわ
上下前次1-新書関写板覧索設栞歴
あと 442 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.021s