簡體   English   中英

C語言中的內存保護

[英]Memory protection in C

C中沒有內存保護嗎? 進程可以編輯任何內存空間嗎? C如何確定分配的內存是否存儲在某個地方? 例如 :

int a[2] = {2,3};
int *ptrA = &a;

int b = 10;
int *ptrB = &b;

printf("%d ",*(ptrA+1009));
*(ptrA+1009) = 10;
printf("%d \n",*(ptrA+1009));

printf("%d ",*(ptrB+1009));
*(ptrB+1009) = 10;
printf("%d\n",*(ptrB+1009));

在這里,指向未分配內存的指針具有讀/寫訪問權限。 片段符合並運行並顯示警告。 它是不確定的行為/機器相關的嗎?

內存保護並不意味着您想像的是什么:采取措施可以阻止進程訪問不應訪問的內存。 但是,進程當然可以訪問它們自己的內存,而C / C ++和許多其他語言可以使您做到這一點。

在這里,指向未分配內存的指針具有讀/寫訪問權限。

將指針取消引用到未分配狀態就是我們所說的軟件錯誤:)但是,編譯器允許您這樣做完全可以。 C / C ++ 不會退縮 ,如果您想與指針打交道,那就一定要這樣做。 如果您嘗試訪問的地址未映射到進程的內存中(即工作中的內存保護 ),則將引發未定義的行為或分段錯誤,但是使用這些語言,您可以這樣做。

不,C語言沒有內置的內存保護功能,但是使用指針訪問它所指向的對象之外的內存(就像您的代碼一樣)會調用未定義的行為。 “未定義的行為”並不意味着程序必須失敗或發出任何特定的診斷。 這些是允許的結果,但是如果需要這些結果,那么這將是定義的行為。

C / C ++標准對取消引用地址沒有任何要求。 它們提供對原始內存的訪問,因此足夠通用,可以在裸機,虛擬內存系統等上有效。因此,就語言而言,通過指向指針的偏移量訪問變量是完全有效的通常是另一個變量或任何內存引用。 但是,它是未定義的行為,因此實際行為通常取決於運行時和/或操作系統和/或硬件。

該編譯器可以自由地將邊界檢查添加到所有內存引用。 但是,C / C ++的一般好處是對內存的原始訪問。 運行時邊界檢查通常太昂貴,無法實際用於生產環境,但通常用於調試中以查找這些類型的錯誤。 有關運行時邊界檢查的良好示例,請參見valgrindclang地址清理器。

大多數編譯器會提供基本的靜態邊界檢查警告。 通常,您可以( 應該 )使用-Werror這樣的開關將它們轉換為錯誤。 還有各種靜態分析器可以識別潛在且可驗證的越界訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM