【问题标题】:Expose memory as read-only将内存公开为只读
【发布时间】:2009-03-07 18:54:02
【问题描述】:

在 C 语言中,函数可以将它在较低级别“管理”的内存公开为只读给调用该函数的人(公开其地址)。 return * const 无效,但我想知道我是否忽略了编程滴答声?

谢谢。

const uint8_t * get_value(int index) 
{
static uint8_t data[2] = {0, 0};
return (const uint8_t *)&data[index];
}

int main(void)
{
uint8_t * value;
value = get_value(1);

*value += 1;
return 0;
}

@j_random_hacker 对我的问题提出了一个很好的折衷方案,这为我正在寻找的额外障碍提供了额外的障碍,以防止随意滥用该数据。

typedef struct
{
    const uint8_t * value;
    const uint8_t size;

} readonly_t;

readonly_t get_value(int index, int size) 
{
    static uint8_t data[2] = {0, 0};
    uint8_t rsize;

    /* ... validate index, size params */

    readonly_t r = { &data[index], rsize };
    return r;
}

【问题讨论】:

  • 我不知道为什么这是一个社区维基。
  • 我的错误。在这里和那里单击几下即可快速,然后提交 - 但无法撤消。

标签: c memory-management pointers


【解决方案1】:

是C!你不能:)总有办法绕过它。把它改成const,希望有人不会改变它。

如果您托管加载项或其他内容,则应在单独的进程中运行它以限制其对内存的访问。

【讨论】:

  • 标记答案,因为您在技术上是正确的 - 在这种情况下,我无法实现真正​​的只读功能。感谢您的意见
【解决方案2】:

【讨论】:

  • 平台相关和分配粒度 >= 4KB。但如果这不是问题... :)
  • 不能在 MS 平台上工作,远非如此。使用 OSEK 操作系统和 vanilla C,没有标准库等。
  • 是的,我同意,这是一个不合时宜的回答。但我想其他人会指出它在 C 中是不可能的。当然,调用者总是可以使用 VirtualProtect() 来更改状态。最好的办法是返回某种句柄并将其映射到内部的不透明数据结构。
【解决方案3】:

不返回指针,返回指向对象的值,如下所示:

uint8_t get_value(int index) 
{
    static uint8_t data[2] = {0, 0};
    return data[index];
}

【讨论】:

  • 我会,但这可能是 n 字节的长度,例如结构
  • 那么,你已经拥有的就是使用这种语言所能做到的最好的了。
  • 如果 n 是固定的,您可以将数组包装在结构中并按值返回。 C 允许将结构体视为一等值(它们可以用 = 赋值、传递给函数和从函数返回),但由于某种原因不允许数组。
  • 因为数组只有在非常特殊的条件下才具有值上下文(sizeof 运算符为一个),并且在所有其他情况下衰减为指向数组第一个对象的指针。
  • @j_random_hacker:我喜欢你的方法。但是,结构化的问题是 a) 内存创建/复制开销 b) 更改每个 API 或陷入丑陋的强制转换。
【解决方案4】:

内存保护不是'C'中的语言结构,它与硬件有关。例如,如果指针指向的内存在某个 ROM 区域之类的,则无法写入。反过来说,我们甚至可以在硬件层面制作 ReadOnly 的部分,然后你可以期待一些内存异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2011-03-15
    • 2011-08-22
    • 2011-04-23
    相关资源
    最近更新 更多