Linuxとwindowsプラットフォームの中でプログラムの境界を越えるいくつかの発見について
最近、linuxの下で実現したいものがあります.実践の過程で、このような問題を発見しました.
linuxはwindowsのアドレス境界保護と大きく異なります.
例えば、入力マトリクスのCプログラム:
入力を受け入れる:
2 3//マトリクスサイズ2 X 3
1 2 3
4 5 6
出力:
1 2 3
4 5 6
ポイントはプログラムの感嘆符注釈で、アドレスに1000のオフセット量を加えたことです.
Windowsの下で長い間コードを書いていたので、このような状況は間違いなく境界を越えたに違いありませんが、linuxの下では問題なく、よく実行されています.もちろん,linuxにブレークエラーなどの境界概念がないわけではないが,プログラムのプライベートアドレス空間など便利な概念ではwinとは異なる可能性がある.
現在の問題は次のとおりです.
私はwebのコンパイラを作っていて、ユーザーが提出したプログラムを実行するのに使えますが、このようなwin型エラーがlinuxで正しく実行できると、プログラムの動作が一致しません.
後記:
これはメモリの管理に関係しているのではないかと思います.Linuxはセグメント・ページ型のメモリ管理方式に基づいているはずですが、一般的なオペレーティング・システムの知識から言えば、4 KBはページごとによくあるのではないでしょうか.したがって、1つのこのようなcプログラムは、1ページにしか割り当てられない可能性があり、メモリのマッピング原理によれば、このページ内にあるアドレスはいずれもプログラムの合法的なアドレスであり、実際には、プログラムが4 Kbほどの空間を使うことができないかもしれない~だから、境界を越えていないのは合理的な解釈である.
linuxはwindowsのアドレス境界保護と大きく異なります.
例えば、入力マトリクスのCプログラム:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int **array,a,b,i,j;
scanf("%d",&a);
while(a!=-1){
scanf("%d",&b);
array=(int **)malloc(sizeof(int *)*a);
for(i=0;i<a;i++){
*(array+i) = (int*)malloc(sizeof(int)*b);
for(j=0;j<b;j++){
scanf("%d",(*(array+i)+j+1000));//!!!
printf("%d ",*(*(array+i)+j+1000));//!!!
}
printf("
");
}
scanf("%d",&a);
}
}
入力を受け入れる:
2 3//マトリクスサイズ2 X 3
1 2 3
4 5 6
出力:
1 2 3
4 5 6
ポイントはプログラムの感嘆符注釈で、アドレスに1000のオフセット量を加えたことです.
Windowsの下で長い間コードを書いていたので、このような状況は間違いなく境界を越えたに違いありませんが、linuxの下では問題なく、よく実行されています.もちろん,linuxにブレークエラーなどの境界概念がないわけではないが,プログラムのプライベートアドレス空間など便利な概念ではwinとは異なる可能性がある.
現在の問題は次のとおりです.
私はwebのコンパイラを作っていて、ユーザーが提出したプログラムを実行するのに使えますが、このようなwin型エラーがlinuxで正しく実行できると、プログラムの動作が一致しません.
後記:
これはメモリの管理に関係しているのではないかと思います.Linuxはセグメント・ページ型のメモリ管理方式に基づいているはずですが、一般的なオペレーティング・システムの知識から言えば、4 KBはページごとによくあるのではないでしょうか.したがって、1つのこのようなcプログラムは、1ページにしか割り当てられない可能性があり、メモリのマッピング原理によれば、このページ内にあるアドレスはいずれもプログラムの合法的なアドレスであり、実際には、プログラムが4 Kbほどの空間を使うことができないかもしれない~だから、境界を越えていないのは合理的な解釈である.