【问题标题】:Passing pointer to static global variable in C将指针传递给C中的静态全局变量
【发布时间】:2014-04-19 22:03:44
【问题描述】:

将指向静态结构的指针传递给函数是否安全?

我有这样的事情:

mymodule.c:

static MYEVENT_STRUC_T event;
uint_32 _myRtos_set_event(MYEVENT_STRUCT_T* event_ptr, uint_32 mask);

uint_32 mymodule_set_event(uint_32 event_mask){   

    /* Kernel function */
    /* Defined outside mymodule.c,*/
    /* Is it safe to call it with &event?  */
    return _myRtos_set_event(&event, event_mask);

}

【问题讨论】:

  • 先验,这似乎是安全的。注意:您忘记了定义中的输入参数MYEVENT_STRUCT_T* event_ptr,因此_myRtos_set_event(event, event_mask);
  • 绝大多数不处理内存分配的函数都会对静态变量的地址感到满意。例如,您不能调用 reallocfree 并将指向静态变量的指针传递给它,但大多数函数是安全的。

标签: c static-variables


【解决方案1】:

这是安全的。 static 并不是说​​“不能在模块外使用”,而是“不能在模块外引用”,即符号本身不会被导出,但变量仍然存在于内存的某处进程的一个也可以在模块之间使用。

我唯一不确定的是,如果您正在这样做,我不确定通过指针将数据从用户模式传递到内核模式是否安全。如果我没记错的话,您应该调用一些函数,将内存从用户空间复制到内核空间。不过不完全确定。

【讨论】:

  • "有一些你应该调用的函数将内存从用户空间复制到内核空间" --- 内核负责这个;除非您正在编写内核,否则您甚至不应该知道存在这样的函数。
  • 如果这是Windows,我相信内核模式代码可以触及用户模式内存,如果你的内核模式代码是在用户进程的上下文中执行的。那就是用户模式代码调用内核模式代码,并且内核模式代码在用户的上下文中执行,因此可以访问用户模式内存,直到内核模式代码完成执行并从用户调用返回。我不太确定它在 Linux 上是如何工作的。我的信息是从 NT 回来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多