【问题标题】:Splint funny error message夹板有趣的错误信息
【发布时间】:2013-11-04 11:00:35
【问题描述】:

我在一段 C 代码上运行 splint,它给了我以下语句:

jmptable.c:34:5: Implicitly only storage vm->jumptable (type struct
     jumptable_entry **) not released before assignment:
     vm->jumptable = (struct jumptable_entry **)calloc(vm->jumptable_size + 1,
     sizeof(struct jumptable_entry *))

  A memory leak has been detected. Only-qualified storage is not released
  before the last reference to it is lost. (Use -mustfreeonly to inhibit
  warning)

我知道夹板希望我在使用 calloc 分配内存之前先 free 分配内存,但由于这是在应用程序的初始化过程中,我应该担心吗?

编辑:这是 vm->jumptable 的初始化方式

vm->jumptable = (struct jumptable_entry**) calloc(vm->jumptable_size + 1,
                                          sizeof(struct jumptable_entry*));

【问题讨论】:

  • 我们需要在这里查看更多代码才能真正了解发生了什么。
  • 需要说明vm->jumptable是如何初始化的。

标签: c splint


【解决方案1】:

好的,这是第一个任务。但是下一个任务会发生什么?如果 vm->jumptable 不为空,您应该添加一个检查以释放内存。

编辑/澄清:如果结构的初始化是在可以随时调用以更改特定指针的方法中完成的,那么从您包含的代码片段中并不明显。如果是这样,那么下次您将尝试分配一个值(从而更改当前值)时,将发生内存泄漏。在该方法中,确保释放前一个实例中分配的内存是必不可少的。

因此,如果您绝对确定不会使用与初始化相同的方法重新分配代码中的值,则只能忽略该消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多