编译LLVM 15.0.4时遭遇invalid ‘static_cast’类型转换错误求助
解决LLVM 15.0.4编译时的invalid static_cast错误
错误信息
/home/pegasus/Documents/LLVM_Rust/CCR-master/llvm/lib/MC/MCAssembler.cpp: In member function ‘void llvm::MCAssembler::layout(llvm::MCAsmLayout&)’: /home/pegasus/Documents/LLVM_Rust/CCR-master/llvm/lib/MC/MCAssembler.cpp:1221:28: error: invalid ‘static_cast’ from type ‘llvm::MCSection’ to type ‘llvm::MCSectionELF&’ 1221 | MCSectionELF &ELFSec = static_cast<MCSectionELF &>(Sec);
问题原因
错误出现在直接用C++原生static_cast将基类MCSection强转为派生类MCSectionELF的引用。static_cast不会在运行时校验类型合法性,当Sec实际并非MCSectionELF类型时就会触发该错误。LLVM体系中MCSection是所有节类型的基类,MCSectionELF仅对应ELF格式的节,必须先确认类型再执行转换。
解决方案
使用LLVM提供的isa+cast(或dyn_cast)工具安全处理多态类型转换:
方法1:确定类型后用cast(适用于上下文已明确类型的场景)
如果已经通过MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF这类判断确认Sec是ELF节,直接用LLVM的cast替代static_cast:
// 放在ELF类型检查的代码块内执行 if (MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF) { MCSectionELF &ELFSec = llvm::cast<MCSectionELF&>(Sec); // 后续对ELFSec的操作逻辑 }
方法2:用dyn_cast动态校验(适用于不确定类型的场景)
若无法提前确定类型,用dyn_cast转换并检查结果有效性:
MCSectionELF *ELFSec = llvm::dyn_cast<MCSectionELF>(&Sec); if (ELFSec) { // 对ELFSec指针的操作逻辑,比如 ELFSec->getFlags(); }
结合你的代码逻辑优化
你的代码中已经有ELF文件类型判断,可以把节类型转换放到该分支内,确保只有ELF节才执行转换:
// Update alignment size to reflect to the size of MF and MBB if (MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF && secName.find(".text") == 0 && (isa<MCAlignFragment>(&Frag)) && fragOffset > 0) { // 新增安全类型转换 MCSectionELF &ELFSec = llvm::cast<MCSectionELF&>(Sec); // Push this alignment to the previous MBB and the MF that the MBB belongs to unsigned alignSize; std::string ID; if (isa<MCDataFragment>(*prevFrag)) ID = static_cast<MCDataFragment*>(prevFrag)->getLastParentTag(); if (isa<MCRelaxableFragment>(*prevFrag)) ID = static_cast<MCRelaxableFragment*>(prevFrag)->getInst().getParent(); alignSize = computeFragmentSize(Layout, Frag); MAI->updateByteCounter(ID, alignSize, 0, /*isAlign=*/ true, /*isInline=*/ false); }
内容的提问来源于stack exchange,提问作者NobinPegasus
相关产品推荐
相关产品推荐

