راستش نمیدونم جوابم چقد میتونه به شما کمک کنه اما مطمئن باشین که هدف آف تاپیک یا همچین چیزی ندارم فقط میخوام بگم که این مثالی که شما اینجا زدین اصلا buffre overflow نیست. این این مکانیزمیه که موقع طراحی و پیاده سازی زبان لحاظ میشه. ینی ممکنه یه زبان در زمان کامپایل محدوده آدرس دهی آرایه رو چک کنه و یکی دیگه این کارو نکنه و اونو موکول کنه به زمان اجرا که اون موقع خطای دسترسی به حافظه ی غیرمجاز روی میده و اصلا buffer overflow یه چیز دیگه س. من راستش از سی شارپ خبر ندارم اما میدونم که سی و سی پلاس محدوده آرایه رو در زمان کامپایل چک نمیکنن.
راستش این چیزی بود که من از سوال شما متوجه شدم و میدونم که جواب شما نیست. خلاصه ببخشید دیگه هروقت که منو در مورد منظورتون توجیه کردین دوباره مزاحم میشم و درباره ی سیاست هاس انسی باهم بحث میکنیم
ممنون که نظر دادی ، فن بیان من یکمی ضعیفه
نتونستم درست توجیه کنم
مثلا این کد :
#include <stdio.h>
#include <stdlib.h>
void manipulate(char *buffer) {
char newbuffer[80];
strcpy(newbuffer,buffer);
}
int main() {
char ch,buffer[4096];
int i=0;
while ((buffer[i++] = getchar()) != '\n') {};
i=1;
manipulate(buffer);
i=2;
printf("The value of i is : %d\n",i);
return 0;
}
اینجا اگر 160 کاراکتر وارد کنیم ، آرایه سرریز میشه و بعد از آرایه هم Over write میشه ، حالا چرا ANSI تغییری در استاندارد اعمال نمیکنه که تابع strcpy امن بشه و بافر newbuffer سرریز نکنه ؟
توی کامپایلرهایی مثل gcc یا Visual Studio این مقدار لحاظ میشه ، حتی خوده visual Studio میگه به جای scanf از scanf_s استفاده کنید و..
ولی سوال اینجاست که چرا ANSI این کار رو انجام نمیده ؟
بحث ما کامپایلر نیست ، بحث ما سازمان ANSI هست که چرا این کار رو انجام نمیده ، حتما باید دلیلی داشته باشه
وگرنه این مورد مطمئنا به ذهن انسان هایی پیش از من هم خطور کرده