为什么隐式free的声明在llvm中采用vararg参数

时间:2019-04-26 13:38:43

标签: clang llvm-clang llvm-ir

采用以下代码

int main() {
  int* a = (int*) malloc(sizeof(int) * 10);
  free(a);
  return 0;
}

如果通过clang -S -emit-llvm -O0 -g将其编译为llvm IR,则free的声明为:

declare i32 @free(...) #2

但是,如果我添加#include <stdlib.h>,则free的声明为:

declare void @free(i8*) #2

通过添加include,显然可以从头文件中获取声明,但是为什么隐式free的声明不同?

1 个答案:

答案 0 :(得分:2)

在C中(如果有效的C标准允许),函数foo的隐含类型在没有先验的情况下被调用 原型或定义为int foo(),在C中表示带有未指定参数的函数,返回int 。 从C99开始,隐式声明函数是非法的,在C ++中始终是非法的。

如果使用这些选项完全编译了该代码,您将看到 mallocfree隐式声明的警告,尽管它们 不清楚隐式类型是什么。如果使用clang ++而不是clang进行编译,则会看到两个错误