繁体   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