gpt4 book ai didi

c - const struct pointer 是否保证内存损坏/崩溃问题的安全性?

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:24 28 4
gpt4 key购买 nike

我有如下代码:

struct abc
{
int *xyz;
}

void func1(abc *ptr, .... lots of other struct ptrs passed)
{
func2(ptr->xyz) // some computation, only read from ptr->xyz
...
...
func3(ptr->xyz) // some computation, ptr->xyz is only read
}

void main()
{
abc *ptr;
// memory is allocated properly here for ptr and ptr->xyz.
func1(ptr,...);
}

问题:由于 ptr->xyz=0x0,段错误发生在 func3。直到 func2,ptr->xyz 地址是正确的。在 func3 之前没有其他相关代码。不可重现。核心转储中关于内存损坏或 valgrind 启动的信息不多。

分析:我运行 GDB 并在正常工作情况下使用命令 awatch *(ptr->xyz 的地址)。在整个 func1、func2、func3 中,我们只从 ptr->xyz 内存地址读取。在正常工作情况下,不会发生写操作。所以我相信这可能是由于其他一些内存损坏重叠造成的。

问题:如果我作为 void func1(const abc *const ptr) 传递。我不想更改 abc 或 abc->xyz 的地址/数据。“const”是否确保 struct abc,abc->xyz 始终存储在内存中的某个只读段中,从而避免任何内存损坏?可能是由于其他结构内存地址重叠写入?

谢谢!

最佳答案

Does "const" ensure that struct abc,abc->xyz always gets stored in some read-only segment in memory, and hence safe from any memory corruption ?

不,不是总是。使用 const,如果代码故意尝试修改变量,编译时的诊断(警告/错误)会发出。

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. C11 §6.7.3 6

如果代码尝试在运行时修改 const 变量,它可能会工作,也可能会静默失败,甚至可能使程序崩溃。这是未定义的行为。

在 OP 的情况下,可疑代码正在写入边界外并写入字段 xyz,因此使 xyz const 不会有太大帮助。

关于c - const struct pointer 是否保证内存损坏/崩溃问题的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38483224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com