Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 防止内核代码中出现双kfree?_C_Linux_Memory Management_Linux Kernel_Kernel - Fatal编程技术网

C 防止内核代码中出现双kfree?

C 防止内核代码中出现双kfree?,c,linux,memory-management,linux-kernel,kernel,C,Linux,Memory Management,Linux Kernel,Kernel,我正在linux内核中处理一些系统调用。既然doublekfree()会引发错误,那么有什么好的防范措施呢 我想到的一个明显的想法是在kfree()之后将指针设置为NULL,并在下一个可能的kfree()之前检查它是否为NULL。我不确定这样做是否正确。请指导我。通常,你希望通过设计避免这种情况。几个例子: kmalloc()在您的驱动程序的上。探测,然后您kfree()在您的驱动程序的上。删除。那么您就很好了,probe/remove调用由内核平衡 在char驱动程序的上打开kmalloc(

我正在linux内核中处理一些系统调用。既然double
kfree()
会引发错误,那么有什么好的防范措施呢


我想到的一个明显的想法是在
kfree()
之后将指针设置为
NULL
,并在下一个可能的
kfree()
之前检查它是否为
NULL
。我不确定这样做是否正确。请指导我。

通常,你希望通过设计避免这种情况。几个例子:

  • kmalloc()
    在您的驱动程序的
    上。探测
    ,然后您
    kfree()
    在您的驱动程序的
    上。删除
    。那么您就很好了,
    probe/remove
    调用由内核平衡
  • 在char驱动程序的
    上打开
    kmalloc()
    ,然后在驱动程序的
    上释放
    kfree()
    。同样好的是,
    open/release
    调用由内核平衡
但是,在某些情况下,由于某种原因,如果分配了对象,您只想取消分配对象,那么在
kfree()
之前清空指针并进行检查的方法是完全正确的。(我会说这是一个设计拙劣的痕迹……但我曾经在那里做过;)


将来,当您遇到这样的问题时,如果您想知道某个方法是否足够流行,您可以浏览内核源代码。寻找类似的驱动程序,看看使用了什么模式。它将给你巨大的洞察力

通常,您希望通过设计避免这种情况。几个例子:

  • kmalloc()
    在您的驱动程序的
    上。探测
    ,然后您
    kfree()
    在您的驱动程序的
    上。删除
    。那么您就很好了,
    probe/remove
    调用由内核平衡
  • 在char驱动程序的
    上打开
    kmalloc()
    ,然后在驱动程序的
    上释放
    kfree()
    。同样好的是,
    open/release
    调用由内核平衡
但是,在某些情况下,由于某种原因,如果分配了对象,您只想取消分配对象,那么在
kfree()
之前清空指针并进行检查的方法是完全正确的。(我会说这是一个设计拙劣的痕迹……但我曾经在那里做过;)


将来,当您遇到这样的问题时,如果您想知道某个方法是否足够流行,您可以浏览内核源代码。寻找类似的驱动程序,看看使用了什么模式。它将给你巨大的洞察力

与非内核代码相同:知道谁拥有指针。@MooingDuck对不起,我没有得到你。我指的是代码中的全局指针,如果这是您的意思的话?
既然double kfree()会引发错误,那么有什么好的防范措施呢?
-最好的防范措施是消除所有double
kfree
,因为这是内核API的错误用法。如果您想调试具体的问题,请使用在这种具体情况下有助于您的任何方法。如果您想允许使用double
kfree
,则需要将指针标记为已释放,最简单的方法是在释放的内存中设置一些标志。@Tsyvarev所以我建议的使用NULL的策略似乎还可以?@bawejakunal如何在普通代码中防止双重释放?与非内核代码相同:知道谁拥有指针。@MooingDuck很抱歉我没有理解你。我指的是代码中的全局指针,如果这是您的意思的话?
既然double kfree()会引发错误,那么有什么好的防范措施呢?
-最好的防范措施是消除所有double
kfree
,因为这是内核API的错误用法。如果您想调试具体的问题,请使用在这种具体情况下有助于您的任何方法。如果您想允许使用double
kfree
,则需要将指针标记为已释放,最简单的方法是在已释放的内存中设置一些标志。@Tsyvarev所以我建议的使用NULL的策略似乎是可行的?@bawejakunal如何防止正常代码中的double free?