有没有一种方法可以静态分析C语言中的内存分配?

有没有一种方法可以静态分析C语言中的内存分配?,c,pointers,memory-management,static-analysis,C,Pointers,Memory Management,Static Analysis,如果在函数中动态分配一段内存,则必须在函数中释放该内存,或者必须从函数中取出指向该内存的指针。因此,我认为在静态分析期间,应该可以跟踪指向函数中已分配内存段的指针,如果指针没有从函数中取出,并且其内存没有释放,那么分析器应该抛出一个错误 在C语言中,不知道哪些函数输出指向分配内存的指针。因此,为了使这种分析有效,它还应该分析函数中调用的所有函数 有时跟踪指针并不容易,例如,如果将指向已分配内存的指针放在数组中,并且数组以难以计算的方式被洗牌。然后,如果分析仪无法跟踪指针,可能会发出警告。但是,分

如果在函数中动态分配一段内存,则必须在函数中释放该内存,或者必须从函数中取出指向该内存的指针。因此,我认为在静态分析期间,应该可以跟踪指向函数中已分配内存段的指针,如果指针没有从函数中取出,并且其内存没有释放,那么分析器应该抛出一个错误

在C语言中,不知道哪些函数输出指向分配内存的指针。因此,为了使这种分析有效,它还应该分析函数中调用的所有函数

有时跟踪指针并不容易,例如,如果将指向已分配内存的指针放在数组中,并且数组以难以计算的方式被洗牌。然后,如果分析仪无法跟踪指针,可能会发出警告。但是,分析有助于检查函数是否有一个不进行清理(关闭文件和释放临时数组)的地方

如果函数声明包含函数可以输出指向已分配内存的指针的方式的信息,则分析会更容易,类似于Java方法标记如何包含它们抛出哪些异常的信息。这不是C语言,但是有没有一种语言有函数声明,其中包含函数如何输出指向已分配内存块的指针的信息?函数声明可以如下所示:

void* malloc(size_t size) allocates return;

// this function creates an array of unknown size and writes it to *dest,
// returns the size of the array
size_t createArray(int** dest) allocates *dest;

对于静态分析可能不可能,但对于动态分析,您可以使用。指针可以转换为其他类型,存储在
静态
变量中,进行添加、减去,因此,我认为静态分析将非常困难。如果一个函数分配了几个内存块,并将它们链接到一个抽象的数据结构中,比如一棵树或一个链表,那么你需要一些方法来注释它。这不是C语言,但是有没有一种语言有函数声明,其中包含函数如何输出指向已分配内存块的指针的信息?不完全是这样,但是有一些语言可以保证内存安全。以生锈为例,编译器可以做一些分析,但不可能有完整的解决方案,因为它相当于停止问题。如果你有一个例程,它总是能告诉你一个例程是否分配了内存,但没有释放或返回内存,我可以把它包含在一个例程中,询问它自己是否分配了内存,如果答案是否定的,则分配了内存,返回时没有释放或返回内存,但是如果答案是肯定的,返回时没有分配内存。所以答案是错误的。因此,这样的例行程序不可能存在。