为什么隐式free的声明在llvm中采用vararg参数
Why implicit free's declaration is taken vararg parameter in llvm
采取以下代码
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,明明声明是从头文件中取出来的,但是为什么implicit free的声明不一样呢?
在 C 中(当有效的 C 标准允许时)函数的隐含类型 foo
原型或定义是 int foo()
,这在 C 中意味着 接受未指定参数的函数,返回 int。
从 C99 开始,函数的隐式声明是非法的,并且在 C++ 中始终是非法的。
如果您使用这些选项准确编译该代码,您将会看到
malloc
和 free
的隐式声明的警告,尽管它们
不要说清楚隐含的类型是什么。如果你用 clang++ 而不是 clang 编译,你会看到两个 errors.
采取以下代码
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,明明声明是从头文件中取出来的,但是为什么implicit free的声明不一样呢?
在 C 中(当有效的 C 标准允许时)函数的隐含类型 foo
原型或定义是 int foo()
,这在 C 中意味着 接受未指定参数的函数,返回 int。
从 C99 开始,函数的隐式声明是非法的,并且在 C++ 中始终是非法的。
如果您使用这些选项准确编译该代码,您将会看到
malloc
和 free
的隐式声明的警告,尽管它们
不要说清楚隐含的类型是什么。如果你用 clang++ 而不是 clang 编译,你会看到两个 errors.