mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[llvm][clang][mlir] Add checks for the return values from Target::createXXX to prevent protential null deref
All these potential null pointer dereferences are reported by my static analyzer for null smart pointer dereferences, which has a different implementation from `alpha.cplusplus.SmartPtr`. The checked pointers in this patch are initialized by Target::createXXX functions. When the creator function pointer is not correctly set, a null pointer will be returned, or the creator function may originally return a null pointer. Some of them may not make sense as they may be checked before entering the function, but I fixed them all in this patch. I submit this fix because 1) similar checks are found in some other places in the LLVM codebase for the same return value of the function; and, 2) some of the pointers are dereferenced before they are checked, which may definitely trigger a null pointer dereference if the return value is nullptr. Reviewed By: tejohnson, MaskRay, jpienaar Differential Revision: https://reviews.llvm.org/D91410
This commit is contained in:
parent
5d081c873a
commit
59b89a3124
@ -307,6 +307,7 @@ bool AsmPrinter::doInitialization(Module &M) {
|
||||
std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
|
||||
TM.getTargetTriple().str(), TM.getTargetCPU(),
|
||||
TM.getTargetFeatureString()));
|
||||
assert(STI && "Unable to create subtarget info");
|
||||
OutStreamer->AddComment("Start of file scope inline assembly");
|
||||
OutStreamer->AddBlankLine();
|
||||
emitInlineAsm(M.getModuleInlineAsm() + "\n",
|
||||
|
@ -147,6 +147,7 @@ void AsmPrinter::emitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
|
||||
// we only need MCInstrInfo for asm parsing. We create one unconditionally
|
||||
// because it's not subtarget dependent.
|
||||
std::unique_ptr<MCInstrInfo> MII(TM.getTarget().createMCInstrInfo());
|
||||
assert(MII && "Failed to create instruction info");
|
||||
std::unique_ptr<MCTargetAsmParser> TAP(TM.getTarget().createMCAsmParser(
|
||||
STI, *Parser, *MII, MCOptions));
|
||||
if (!TAP)
|
||||
|
@ -40,13 +40,16 @@ static cl::opt<bool> EnableTrapUnreachable("trap-unreachable",
|
||||
|
||||
void LLVMTargetMachine::initAsmInfo() {
|
||||
MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str()));
|
||||
assert(MRI && "Unable to create reg info");
|
||||
MII.reset(TheTarget.createMCInstrInfo());
|
||||
assert(MII && "Unable to create instruction info");
|
||||
// FIXME: Having an MCSubtargetInfo on the target machine is a hack due
|
||||
// to some backends having subtarget feature dependent module level
|
||||
// code generation. This is similar to the hack in the AsmPrinter for
|
||||
// module level assembly etc.
|
||||
STI.reset(TheTarget.createMCSubtargetInfo(
|
||||
getTargetTriple().str(), getTargetCPU(), getTargetFeatureString()));
|
||||
assert(STI && "Unable to create subtarget info");
|
||||
|
||||
MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(
|
||||
*MRI, getTargetTriple().str(), Options.MCOptions);
|
||||
|
@ -28,6 +28,8 @@ static void codegen(Module *M, llvm::raw_pwrite_stream &OS,
|
||||
function_ref<std::unique_ptr<TargetMachine>()> TMFactory,
|
||||
CodeGenFileType FileType) {
|
||||
std::unique_ptr<TargetMachine> TM = TMFactory();
|
||||
assert(TM && "Failed to create target machine!");
|
||||
|
||||
legacy::PassManager CodeGenPasses;
|
||||
if (TM->addPassesToEmitFile(CodeGenPasses, OS, nullptr, FileType))
|
||||
report_fatal_error("Failed to setup codegen");
|
||||
|
@ -199,9 +199,11 @@ createTargetMachine(const Config &Conf, const Target *TheTarget, Module &M) {
|
||||
else
|
||||
CodeModel = M.getCodeModel();
|
||||
|
||||
return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
|
||||
std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
|
||||
TheTriple, Conf.CPU, Features.getString(), Conf.Options, RelocModel,
|
||||
CodeModel, Conf.CGOptLevel));
|
||||
assert(TM && "Failed to create target machine");
|
||||
return TM;
|
||||
}
|
||||
|
||||
static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
|
||||
|
@ -374,10 +374,13 @@ bool LTOCodeGenerator::determineTarget() {
|
||||
}
|
||||
|
||||
TargetMach = createTargetMachine();
|
||||
assert(TargetMach && "Unable to create target machine");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::unique_ptr<TargetMachine> LTOCodeGenerator::createTargetMachine() {
|
||||
assert(MArch && "MArch is not set!");
|
||||
return std::unique_ptr<TargetMachine>(MArch->createTargetMachine(
|
||||
TripleStr, MCpu, FeatureStr, Options, RelocModel, None, CGOptLevel));
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ using namespace llvm::object;
|
||||
LTOModule::LTOModule(std::unique_ptr<Module> M, MemoryBufferRef MBRef,
|
||||
llvm::TargetMachine *TM)
|
||||
: Mod(std::move(M)), MBRef(MBRef), _target(TM) {
|
||||
assert(_target && "target machine is null");
|
||||
SymTab.addModule(Mod.get());
|
||||
}
|
||||
|
||||
|
@ -575,9 +575,12 @@ std::unique_ptr<TargetMachine> TargetMachineBuilder::create() const {
|
||||
Features.getDefaultSubtargetFeatures(TheTriple);
|
||||
std::string FeatureStr = Features.getString();
|
||||
|
||||
return std::unique_ptr<TargetMachine>(
|
||||
std::unique_ptr<TargetMachine> TM(
|
||||
TheTarget->createTargetMachine(TheTriple.str(), MCpu, FeatureStr, Options,
|
||||
RelocModel, None, CGOptLevel));
|
||||
assert(TM && "Cannot create target machine");
|
||||
|
||||
return TM;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -320,6 +320,7 @@ void AArch64AsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
|
||||
assert(TT.isOSBinFormatELF());
|
||||
std::unique_ptr<MCSubtargetInfo> STI(
|
||||
TM.getTarget().createMCSubtargetInfo(TT.str(), "", ""));
|
||||
assert(STI && "Unable to create subtarget info");
|
||||
|
||||
MCSymbol *HwasanTagMismatchV1Sym =
|
||||
OutContext.getOrCreateSymbol("__hwasan_tag_mismatch");
|
||||
|
@ -31,6 +31,7 @@ LLVMState::LLVMState(const std::string &Triple, const std::string &CpuName,
|
||||
TheTargetMachine.reset(
|
||||
static_cast<LLVMTargetMachine *>(TheTarget->createTargetMachine(
|
||||
Triple, CpuName, Features, Options, Reloc::Model::Static)));
|
||||
assert(TheTargetMachine && "unable to create target machine");
|
||||
TheExegesisTarget = ExegesisTarget::lookup(TheTargetMachine->getTargetTriple());
|
||||
if (!TheExegesisTarget) {
|
||||
errs() << "no exegesis target for " << Triple << ", using default\n";
|
||||
@ -67,6 +68,7 @@ bool LLVMState::canAssemble(const MCInst &Inst) const {
|
||||
TheTargetMachine->getTarget().createMCCodeEmitter(
|
||||
*TheTargetMachine->getMCInstrInfo(), *TheTargetMachine->getMCRegisterInfo(),
|
||||
Context));
|
||||
assert(CodeEmitter && "unable to create code emitter");
|
||||
SmallVector<char, 16> Tmp;
|
||||
raw_svector_ostream OS(Tmp);
|
||||
SmallVector<MCFixup, 4> Fixups;
|
||||
|
@ -427,6 +427,7 @@ static void analysisMain() {
|
||||
}
|
||||
|
||||
std::unique_ptr<MCInstrInfo> InstrInfo(TheTarget->createMCInstrInfo());
|
||||
assert(InstrInfo && "Unable to create instruction info!");
|
||||
|
||||
const auto Clustering = ExitOnErr(InstructionBenchmarkClustering::create(
|
||||
Points, AnalysisClusteringAlgorithm, AnalysisDbscanNumPoints,
|
||||
|
@ -469,8 +469,11 @@ int main(int argc, char **argv) {
|
||||
std::unique_ptr<MCStreamer> Str;
|
||||
|
||||
std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo());
|
||||
assert(MCII && "Unable to create instruction info!");
|
||||
|
||||
std::unique_ptr<MCSubtargetInfo> STI(
|
||||
TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr));
|
||||
assert(STI && "Unable to create subtarget info!");
|
||||
|
||||
MCInstPrinter *IP = nullptr;
|
||||
if (FileType == OFT_AssemblyFile) {
|
||||
|
@ -330,6 +330,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
std::unique_ptr<MCSubtargetInfo> STI(
|
||||
TheTarget->createMCSubtargetInfo(TripleName, MCPU, MATTR));
|
||||
assert(STI && "Unable to create subtarget info!");
|
||||
if (!STI->isCPUStringValid(MCPU))
|
||||
return 1;
|
||||
|
||||
@ -373,6 +374,7 @@ int main(int argc, char **argv) {
|
||||
std::unique_ptr<buffer_ostream> BOS;
|
||||
|
||||
std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo());
|
||||
assert(MCII && "Unable to create instruction info!");
|
||||
|
||||
std::unique_ptr<MCInstrAnalysis> MCIA(
|
||||
TheTarget->createMCInstrAnalysis(MCII.get()));
|
||||
@ -443,9 +445,11 @@ int main(int argc, char **argv) {
|
||||
|
||||
std::unique_ptr<MCCodeEmitter> MCE(
|
||||
TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx));
|
||||
assert(MCE && "Unable to create code emitter!");
|
||||
|
||||
std::unique_ptr<MCAsmBackend> MAB(TheTarget->createMCAsmBackend(
|
||||
*STI, *MRI, mc::InitMCTargetOptionsFromFlags()));
|
||||
assert(MAB && "Unable to create asm backend!");
|
||||
|
||||
for (const std::unique_ptr<mca::CodeRegion> &Region : Regions) {
|
||||
// Skip empty code regions.
|
||||
|
@ -315,8 +315,11 @@ int main(int argc, char **argv) {
|
||||
std::unique_ptr<MCStreamer> Str;
|
||||
|
||||
std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo());
|
||||
assert(MCII && "Unable to create instruction info!");
|
||||
|
||||
std::unique_ptr<MCSubtargetInfo> STI(TheTarget->createMCSubtargetInfo(
|
||||
TripleName, /*CPU=*/"", /*Features=*/""));
|
||||
assert(STI && "Unable to create subtarget info!");
|
||||
|
||||
MCInstPrinter *IP = nullptr;
|
||||
if (FileType == OFT_AssemblyFile) {
|
||||
|
@ -7200,10 +7200,32 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
else
|
||||
MachOMCPU = MCPU;
|
||||
|
||||
#define CHECK_TARGET_INFO_CREATION(NAME) \
|
||||
do { \
|
||||
if (!NAME) { \
|
||||
WithColor::error(errs(), "llvm-objdump") \
|
||||
<< "couldn't initialize disassembler for target " << TripleName \
|
||||
<< '\n'; \
|
||||
return; \
|
||||
} \
|
||||
} while (false)
|
||||
#define CHECK_THUMB_TARGET_INFO_CREATION(NAME) \
|
||||
do { \
|
||||
if (!NAME) { \
|
||||
WithColor::error(errs(), "llvm-objdump") \
|
||||
<< "couldn't initialize disassembler for target " << ThumbTripleName \
|
||||
<< '\n'; \
|
||||
return; \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
std::unique_ptr<const MCInstrInfo> InstrInfo(TheTarget->createMCInstrInfo());
|
||||
CHECK_TARGET_INFO_CREATION(InstrInfo);
|
||||
std::unique_ptr<const MCInstrInfo> ThumbInstrInfo;
|
||||
if (ThumbTarget)
|
||||
if (ThumbTarget) {
|
||||
ThumbInstrInfo.reset(ThumbTarget->createMCInstrInfo());
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbInstrInfo);
|
||||
}
|
||||
|
||||
// Package up features to be passed to target/subtarget
|
||||
std::string FeaturesStr;
|
||||
@ -7218,13 +7240,17 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
// Set up disassembler.
|
||||
std::unique_ptr<const MCRegisterInfo> MRI(
|
||||
TheTarget->createMCRegInfo(TripleName));
|
||||
CHECK_TARGET_INFO_CREATION(MRI);
|
||||
std::unique_ptr<const MCAsmInfo> AsmInfo(
|
||||
TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions));
|
||||
CHECK_TARGET_INFO_CREATION(AsmInfo);
|
||||
std::unique_ptr<const MCSubtargetInfo> STI(
|
||||
TheTarget->createMCSubtargetInfo(TripleName, MachOMCPU, FeaturesStr));
|
||||
CHECK_TARGET_INFO_CREATION(STI);
|
||||
MCContext Ctx(AsmInfo.get(), MRI.get(), nullptr);
|
||||
std::unique_ptr<MCDisassembler> DisAsm(
|
||||
TheTarget->createMCDisassembler(*STI, Ctx));
|
||||
CHECK_TARGET_INFO_CREATION(DisAsm);
|
||||
std::unique_ptr<MCSymbolizer> Symbolizer;
|
||||
struct DisassembleInfo SymbolizerInfo(nullptr, nullptr, nullptr, false);
|
||||
std::unique_ptr<MCRelocationInfo> RelInfo(
|
||||
@ -7238,6 +7264,7 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
int AsmPrinterVariant = AsmInfo->getAssemblerDialect();
|
||||
std::unique_ptr<MCInstPrinter> IP(TheTarget->createMCInstPrinter(
|
||||
Triple(TripleName), AsmPrinterVariant, *AsmInfo, *InstrInfo, *MRI));
|
||||
CHECK_TARGET_INFO_CREATION(IP);
|
||||
// Set the display preference for hex vs. decimal immediates.
|
||||
IP->setPrintImmHex(PrintImmHex);
|
||||
// Comment stream and backing vector.
|
||||
@ -7250,12 +7277,6 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
// comment causing different diffs with the 'C' disassembler library API.
|
||||
// IP->setCommentStream(CommentStream);
|
||||
|
||||
if (!AsmInfo || !STI || !DisAsm || !IP) {
|
||||
WithColor::error(errs(), "llvm-objdump")
|
||||
<< "couldn't initialize disassembler for target " << TripleName << '\n';
|
||||
return;
|
||||
}
|
||||
|
||||
// Set up separate thumb disassembler if needed.
|
||||
std::unique_ptr<const MCRegisterInfo> ThumbMRI;
|
||||
std::unique_ptr<const MCAsmInfo> ThumbAsmInfo;
|
||||
@ -7268,13 +7289,17 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
std::unique_ptr<MCRelocationInfo> ThumbRelInfo;
|
||||
if (ThumbTarget) {
|
||||
ThumbMRI.reset(ThumbTarget->createMCRegInfo(ThumbTripleName));
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbMRI);
|
||||
ThumbAsmInfo.reset(
|
||||
ThumbTarget->createMCAsmInfo(*ThumbMRI, ThumbTripleName, MCOptions));
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbAsmInfo);
|
||||
ThumbSTI.reset(
|
||||
ThumbTarget->createMCSubtargetInfo(ThumbTripleName, MachOMCPU,
|
||||
FeaturesStr));
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbSTI);
|
||||
ThumbCtx.reset(new MCContext(ThumbAsmInfo.get(), ThumbMRI.get(), nullptr));
|
||||
ThumbDisAsm.reset(ThumbTarget->createMCDisassembler(*ThumbSTI, *ThumbCtx));
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbDisAsm);
|
||||
MCContext *PtrThumbCtx = ThumbCtx.get();
|
||||
ThumbRelInfo.reset(
|
||||
ThumbTarget->createMCRelocationInfo(ThumbTripleName, *PtrThumbCtx));
|
||||
@ -7288,16 +7313,13 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
ThumbIP.reset(ThumbTarget->createMCInstPrinter(
|
||||
Triple(ThumbTripleName), ThumbAsmPrinterVariant, *ThumbAsmInfo,
|
||||
*ThumbInstrInfo, *ThumbMRI));
|
||||
CHECK_THUMB_TARGET_INFO_CREATION(ThumbIP);
|
||||
// Set the display preference for hex vs. decimal immediates.
|
||||
ThumbIP->setPrintImmHex(PrintImmHex);
|
||||
}
|
||||
|
||||
if (ThumbTarget && (!ThumbAsmInfo || !ThumbSTI || !ThumbDisAsm || !ThumbIP)) {
|
||||
WithColor::error(errs(), "llvm-objdump")
|
||||
<< "couldn't initialize disassembler for target " << ThumbTripleName
|
||||
<< '\n';
|
||||
return;
|
||||
}
|
||||
#undef CHECK_TARGET_INFO_CREATION
|
||||
#undef CHECK_THUMB_TARGET_INFO_CREATION
|
||||
|
||||
MachO::mach_header Header = MachOOF->getHeader();
|
||||
|
||||
|
@ -764,6 +764,8 @@ static int linkAndVerify() {
|
||||
ErrorAndExit("Unable to create disassembler!");
|
||||
|
||||
std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo());
|
||||
if (!MII)
|
||||
ErrorAndExit("Unable to create target instruction info!");
|
||||
|
||||
std::unique_ptr<MCInstPrinter> InstPrinter(
|
||||
TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI));
|
||||
|
Loading…
Reference in New Issue
Block a user