这是LLVM中的错误吗?
问题描述:
我编译该代码(使用铛3.4.2):这是LLVM中的错误吗?
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
typedef struct __entry {
char *name;
int value;
} entry;
int main(int argv, char **argc) {
printf("Size of entry: %lu\n", sizeof(entry));
entry *entry = malloc(sizeof(entry));
printf("entry is at %lu\n", (uint64_t) entry);
}
和我收到此位码:
define i32 @main(i32 %argv, i8** %argc) #0 {
entry:
%argv.addr = alloca i32, align 4
%argc.addr = alloca i8**, align 8
%entry1 = alloca %struct.__entry*, align 8
store i32 %argv, i32* %argv.addr, align 4
store i8** %argc, i8*** %argc.addr, align 8
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([20 x i8]* @.str, i32 0, i32 0), i64 16)
%call2 = call noalias i8* @malloc(i64 8) #3
%0 = bitcast i8* %call2 to %struct.__entry*
store %struct.__entry* %0, %struct.__entry** %entry1, align 8
%1 = load %struct.__entry** %entry1, align 8
%2 = ptrtoint %struct.__entry* %1 to i64
%call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([17 x i8]* @.str1, i32 0, i32 0), i64 %2)
ret i32 0
}
对printf的呼叫接收16作为一个参数(我预期要结构与64位系统上的两个指针)。但是,对malloc的调用会得到8.在C中,它们都得到了相同的参数。到底是怎么回事?
答
sizeof
的两个调用没有得到相同的论据!它看起来只是乍一看。
第一个sizeof(entry)
指的是类型名称。
第二个sizeof(entry)
引用本地指针变量。
定义变量后,不能再引用代码块中的类型。
这意味着标题问题的答案是“否 - LLVM符合标准的要求”。
一个小小的怪癖:第一个sizeof(entry)
必须有括号,因为该参数是一个类型名称。第二个sizeof(entry)
可以写成sizeof entry
,因为这个参数是一个变量的名称而不是一个类型。这允许您确认第二次出现是指变量而不是类型。
+0
arrgh!多么愚蠢的错字。 – Alex
程序运行时是否打印正确的值? – EOF
您的代码调用未定义的行为。 – Stargateur
该错误为类型和对象重载了'entry'标识符。 – Jens