虚方法调用中的分段错误

时间:2013-07-31 07:11:36

标签: segmentation-fault clang llvm

clang使用以下方案在llvm ir中定义具体类型:

%"mytype" = type {virtual_method_types, field_types, super_types}

并且为了调用虚方法(例如virtual int f(){}),使用以下方案:

%0 = load %"mytype"** %this
%1 = bitcast %"mytype"* %0 to i32 (%"mytype"*)***
%vtable = load i32 (%"mytype"*)*** %1
%method = getelementptr inbounds i32 (%"mytype"*)** %vtable, i64 0 (index of f() in vt)
%ld = load i32 (%"mytype"*)** %method 
%call = call i32 (%"mytype"*)* %ld (%"mytype"* %0) 

但是,如果使用以下方案,在上面的代码中应该改变什么来防止seg错误?

 %"mytype" = type {field_types, super_types, virtual_method_types}

1 个答案:

答案 0 :(得分:0)

该行获取对象开头的指针,即vptr(指向虚拟表的指针):

%1 = bitcast %"mytype"* %0 to i32 (%"mytype"*)***

如果将vptr放在对象的末尾,则需要更改此代码以使用extractvalue上的%0来获取指向vptr正确位置的指针(或者getelementptr上的%this,但无论如何需要加载%this,它并没有真正帮助。例如,如果vptr将是%"mytype"中的第12个字段,则需要以下内容:

%1 = extractvalue %"mytype" %0, 12