Ngaphezu kweminyaka emibini sele idlulile oko kujongwe ikhowudi yokugqibela yeprojekthi yeLLVM kusetyenziswa umhlalutyi wethu wePVS-Studio. Masiqinisekise ukuba umhlalutyi we-PVS-Studio usesisixhobo esikhokelayo sokuchonga iimpazamo kunye nobuthathaka obunokubakho. Ukwenza oku, siya kujonga kwaye sifumane iimpazamo ezintsha kwi-LLVM 8.0.0 yokukhululwa.
Inqaku eliza kubhalwa
Xa ndithetha inyani, ndandingafuni ukubhala eli nqaku. Ayinamdla ukubhala malunga neprojekthi esele siyijongile amaxesha amaninzi (
Ngalo lonke ixesha inguqulelo entsha ye-LLVM ikhutshwa okanye ihlaziywa
Jonga, inguqulelo entsha yeClang Static Analyzer ifunde ukufumana iimpazamo ezintsha! Kum kubonakala ngathi ukufaneleka kokusebenzisa i-PVS-Studio kuyehla. UClang ufumana iimpazamo ezininzi kunangaphambili kwaye ubambe amandla ePVS-Studio. Ucinga ntoni ngale nto?
Kule nto ndihlala ndifuna ukuphendula into efana nale:
Nathi asihlali singenzi nto! Siphucule kakhulu amandla e-PVS-Studio analyzer. Sukuba nexhala, siyaqhubeka ukukhokela njengangaphambili.
Ngelishwa, le yimpendulo embi. Akukho bungqina kuyo. Yiyo loo nto ndibhala eli nqaku ngoku. Ke, iprojekthi ye-LLVM iphinde yajongwa kwaye iintlobo ezahlukeneyo zeempazamo zifunyenwe kuyo. Ngoku ndiza kubonisa ezo zibonakala zinomdla kum. Umhlalutyi weClang Static akakwazi kufumana ezi mpazamo (okanye akulula kakhulu ukwenza oko ngoncedo lwayo). Kodwa sinako. Ngaphezu koko, ndizifumene ndaza ndazibhala phantsi zonke ezi mpazamo ngengokuhlwa nje enye.
Kodwa ukubhala eli nqaku kwathabatha iiveki eziliqela. Andikwazanga ukuzisa konke oku kwisicatshulwa :).
Ngendlela, ukuba unomdla kobuphi ubuchwephesha obusetyenziswa kwi-PVS-Studio analyzer ukuchonga iimpazamo kunye nobuthathaka obunokwenzeka, ke ndicebisa ukuba uqhelane nale nto.
Uxilongo olutsha kunye noludala
Njengoko sele kuphawuliwe, malunga neminyaka emibini edlulileyo iprojekthi ye-LLVM yaphinda yahlolwa, kwaye iimpazamo ezifunyenweyo zalungiswa. Ngoku eli nqaku liza kubonisa ibhetshi entsha yeempazamo. Kwakutheni ukuze kufunyanwe iziphene ezintsha? Kukho izizathu ezi-3 zoku:
- Iprojekthi ye-LLVM iyavela, itshintsha ikhowudi endala kwaye yongeza ikhowudi entsha. Ngokwemvelo, kukho iimpazamo ezintsha kwikhowudi elungisiweyo nebhaliweyo. Oku kubonisa ngokucacileyo ukuba uhlalutyo lwe-static kufuneka lusetyenziswe rhoqo, kwaye kungekhona ngamaxesha athile. Amanqaku ethu abonisa kakuhle amandla e-PVS-Studio analyzer, kodwa oku akunanto yakwenza nokuphucula umgangatho wekhowudi kunye nokunciphisa iindleko zokulungisa iimpazamo. Sebenzisa i-static code analyzer rhoqo!
- Siyagqibezela kwaye siphucula iindlela zokuxilonga ezikhoyo. Ke ngoko, umhlalutyi unokuchonga iimpazamo engakhange azibone ngexesha lokuskena kwangaphambili.
- Ukuxilongwa okutsha kuye kwavela kwi-PVS-Studio eyayingekho kwiminyaka eyi-2 eyadlulayo. Ndigqibe kwelokuba ndibaqaqambise kwicandelo elahlukileyo ukuze ndibonise ngokucacileyo uphuhliso lwePVS-Studio.
Iziphene ezichongiweyo ngoxilongo olwalukho kwiminyaka emi-2 eyadlulayo
Iqhekeza N1: Copy-Cola
static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
if (Name == "addcarryx.u32" || // Added in 8.0
....
Name == "avx512.mask.cvtps2pd.128" || // Added in 7.0
Name == "avx512.mask.cvtps2pd.256" || // Added in 7.0
Name == "avx512.cvtusi2sd" || // Added in 7.0
Name.startswith("avx512.mask.permvar.") || // Added in 7.0 // <=
Name.startswith("avx512.mask.permvar.") || // Added in 7.0 // <=
Name == "sse2.pmulu.dq" || // Added in 7.0
Name == "sse41.pmuldq" || // Added in 7.0
Name == "avx2.pmulu.dq" || // Added in 7.0
....
}
PVS-Studio isilumkiso:
Kukhangelwe kabini ukuba igama liqala ngomtya ongezantsi "avx512.mask.permvar.". Kwitshekhi yesibini, ngokucacileyo bafuna ukubhala enye into, kodwa balibale ukulungisa umbhalo okhutshelweyo.
Iqhekeza N2: Typo
enum CXNameRefFlags {
CXNameRange_WantQualifier = 0x1,
CXNameRange_WantTemplateArgs = 0x2,
CXNameRange_WantSinglePiece = 0x4
};
void AnnotateTokensWorker::HandlePostPonedChildCursor(
CXCursor Cursor, unsigned StartTokenIndex) {
const auto flags = CXNameRange_WantQualifier | CXNameRange_WantQualifier;
....
}
Isilumkiso PVS-Studio: V501 Kukho amabinzana afanayo afanayo 'CXNameRange_WantQualifier' ukuya ekhohlo nasekunene kwe '|' umsebenzisi. CIndex.cpp 7245
Ngenxa yokuchwetheza, igama elifanayo lisetyenziswa kabini CXNameRange_WantQualifier.
I-fragment N3: Ukubhideka nokuhamba phambili komsebenzisi
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
....
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
return 0;
....
}
PVS-Studio isilumkiso:
Ngokombono wam, le mpazamo enhle kakhulu. Ewe, ndiyazi ukuba ndinemibono engaqhelekanga malunga nobuhle :).
Ngoku, ngokutsho
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
Ukusuka kwimbono ebonakalayo, imeko enjalo ayinangqondo, kuba inokuncitshiswa ibe:
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
Le yimpazamo ecacileyo. Ngokunokwenzeka, bebefuna ukuthelekisa u-0/1 noguquko isalathisi. Ukulungisa ikhowudi kufuneka udibanise ama-parentheses ajikeleze umsebenzisi we-ternary:
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
Ngendlela, umqhubi we-ternary uyingozi kakhulu kwaye uxhokonxa iimpazamo ezinengqiqo. Yilumkele kakhulu kwaye unganyolukeli izibiyeli. Ndijonge esi sihloko ngokubanzi
Iqhekeza le-N4, i-N5: Isalathi esingenanto
Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
....
TypedInit *LHS = dyn_cast<TypedInit>(Result);
....
LHS = dyn_cast<TypedInit>(
UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get())
->Fold(CurRec));
if (!LHS) {
Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() +
"' to string");
return nullptr;
}
....
}
PVS-Studio isilumkiso:
Ukuba isalathisi I-LHS akukho nto, kufuneka kukhutshwe isilumkiso. Nangona kunjalo, endaweni yoko, kwaesi salathisi singento yanto siya kususwa: LHS->getAsString().
Le yimeko eqhelekileyo xa impazamo ifihliwe kwisiphathi sempazamo, kuba akukho mntu ubavavanyayo. Abahlalutyi be-Static bajonga yonke ikhowudi efikelelekayo, kungakhathaliseki ukuba isetyenziswa rhoqo kangakanani. Lo ngumzekelo omhle kakhulu wendlela uhlalutyo lwe-static luhambelana nolunye uvavanyo kunye neendlela zokukhusela iimpazamo.
Imposiso yokuphatha isalathisi esifanayo HRH kuvunyelwe kwikhowudi engezantsi nje: V522 [CWE-476] Ukurhoxiswa kwesalathisi esingeyonyani 'RHS' kungenzeka. TGParser.cpp 2186
Iqhekeza N6: Ukusebenzisa isalathisi emva kokuhamba
static Expected<bool>
ExtractBlocks(....)
{
....
std::unique_ptr<Module> ProgClone = CloneModule(BD.getProgram(), VMap);
....
BD.setNewProgram(std::move(ProgClone)); // <=
MiscompiledFunctions.clear();
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first); // <=
assert(NewF && "Function not found??");
MiscompiledFunctions.push_back(NewF);
}
....
}
Isilumkiso se-PVS-Studio: I-V522 [CWE-476] Ukurhoxiswa kwesalathisi esingenanto 'ProgClone' inokuthi yenzeke. Miscompilation.cpp 601
Ekuqaleni isalathisi esihlakaniphile ProgClone iyayeka ukuba ngumnini wento:
BD.setNewProgram(std::move(ProgClone));
Enyanisweni, ngoku ProgClone sisalathi esingenanto. Ke ngoko, isalathisi esingeyiyo kufuneka senzeke apha ngezantsi:
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
Kodwa, enyanisweni, oku akuyi kwenzeka! Qaphela ukuba i-loop ayiqhutywanga.
Ekuqaleni kwesitya MiscompiledFunctions Icociwe:
MiscompiledFunctions.clear();
Okulandelayo, ubungakanani besi sikhongozeli busetyenziswa kwimeko yelophu:
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
Kulula ukubona ukuba i-loop ayiqalisi. Ndicinga ukuba oku kwakhona bug kwaye ikhowudi kufuneka ibhalwe ngokwahlukileyo.
Kubonakala ngathi siye sadibana naloo mpazamo idumileyo! Impazamo enye ifihla enye :).
Iqhekeza N7: Ukusebenzisa isalathisi emva kokuhamba
static Expected<bool> TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test,
std::unique_ptr<Module> Safe) {
outs() << " Optimizing functions being tested: ";
std::unique_ptr<Module> Optimized =
BD.runPassesOn(Test.get(), BD.getPassesToRun());
if (!Optimized) {
errs() << " Error running this sequence of passes"
<< " on the input program!n";
BD.setNewProgram(std::move(Test)); // <=
BD.EmitProgressBitcode(*Test, "pass-error", false); // <=
if (Error E = BD.debugOptimizerCrash())
return std::move(E);
return false;
}
....
}
Isilumkiso se-PVS-Studio: I-V522 [CWE-476] Ukurhoxiswa kwesalathisi esingeyonyani 'Uvavanyo' lunokwenzeka. Miscompilation.cpp 709
Imeko efanayo kwakhona. Ekuqaleni, imixholo yento iyashukunyiswa, ize ke isetyenziswe ngokungathi akwenzekanga nto. Ndiyibona le meko ngakumbi nangakumbi kwikhowudi yenkqubo emva kokuba intshukumo yentshukumo ibonakala kwi-C ++. Kungenxa yoko le nto ndithanda ulwimi lwe-C++! Zininzi kwaye zininzi iindlela ezintsha zokudubula owakho umlenze. I-PVS-Studio analyzer iya kuhlala inomsebenzi :).
Iqhekeza le-N8: Isalathisi esingenanto
void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
uint32_t TypeId = Symbol.getTypeId();
auto Type = Symbol.getSession().getSymbolById(TypeId);
if (Type)
Printer << "<unknown-type>";
else
Type->dump(*this);
}
Isilumkiso se-PVS-Studio: V522 [CWE-476] Ukurhoxiswa kwesalathiso esingeyonyani 'Uhlobo' lunokwenzeka. PrettyFunctionDumper.cpp 233
Ukongeza kubaphathi beemposiso, ukulungisa iimpazamo kushicilelo imisebenzi ayisoloko ivavanywa. Sinemeko enjalo phambi kwethu. Umsebenzi ulindele umsebenzisi, owathi, endaweni yokusombulula iingxaki zakhe, uya kunyanzeliswa ukuba alungise.
Ngokuchanekileyo:
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
Iqhekeza le-N9: Isalathisi esingenanto
void SearchableTableEmitter::collectTableEntries(
GenericTable &Table, const std::vector<Record *> &Items) {
....
RecTy *Ty = resolveTypes(Field.RecType, TI->getType());
if (!Ty) // <=
PrintFatalError(Twine("Field '") + Field.Name + "' of table '" +
Table.Name + "' has incompatible type: " +
Ty->getAsString() + " vs. " + // <=
TI->getType()->getAsString());
....
}
Isilumkiso se-PVS-Studio: V522 [CWE-476] Ukurhoxiswa kwesalathiso esingeyonyani 'Ty' kungenzeka. Itheyibhile eSekayoEmitter.cpp 614
Ndicinga ukuba yonke into icacile kwaye ayifuni ngcaciso.
Iqhekeza N10: Typo
bool FormatTokenLexer::tryMergeCSharpNullConditionals() {
....
auto &Identifier = *(Tokens.end() - 2);
auto &Question = *(Tokens.end() - 1);
....
Identifier->ColumnWidth += Question->ColumnWidth;
Identifier->Type = Identifier->Type; // <=
Tokens.erase(Tokens.end() - 1);
return true;
}
PVS-Studio isilumkiso:
Akukho sizathu sokwabela i-variable ngokwayo. Kunokwenzeka ukuba babefuna ukubhala:
Identifier->Type = Question->Type;
Iqhekeza N11: Ikhefu elikrokrisayo
void SystemZOperand::print(raw_ostream &OS) const {
switch (Kind) {
break;
case KindToken:
OS << "Token:" << getToken();
break;
case KindReg:
OS << "Reg:" << SystemZInstPrinter::getRegisterName(getReg());
break;
....
}
PVS-Studio isilumkiso:
Kukho umntu osebenza ngokukrokra kakhulu ekuqaleni aphule. Ulibele ukubhala enye into apha?
Iqhekeza le-N12: Ukujonga isalathisi emva kokushenxiswa kwereferensi
InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
Function *Callee = CS.getCalledFunction();
Function *Caller = CS.getCaller();
TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);
if (!Callee || Callee->isDeclaration())
return llvm::InlineCost::getNever("undefined callee");
....
}
PVS-Studio isilumkiso:
Isikhombisi Calee ekuqaleni ayijongwanga ngexesha ubizwa ngalo umsebenzi fumanaTTI.
Kwaye emva koko kuvela ukuba esi salathisi kufuneka sihlolwe ukulingana nullptr:
if (!Callee || Callee->isDeclaration())
Kodwa seku late...
Iqhekeza N13 - N...: Ukujonga isalathisi emva kokurhoxiswa
Imeko exoxwe ngayo kwiqhekeza lekhowudi yangaphambili ayiyodwa. Ivela apha:
static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
bool isBinary, bool isPrecise = false) {
....
Function *CalleeFn = CI->getCalledFunction();
StringRef CalleeNm = CalleeFn->getName(); // <=
AttributeList CalleeAt = CalleeFn->getAttributes();
if (CalleeFn && !CalleeFn->isIntrinsic()) { // <=
....
}
Isilumkiso se-PVS-Studio: V595 [CWE-476] Isalathisi se-'CalleeFn' sisetyenziswe ngaphambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 1079, 1081. SimplifyLibCalls.cpp 1079
Kwaye apha:
void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
const Decl *Tmpl, Decl *New,
LateInstantiatedAttrVec *LateAttrs,
LocalInstantiationScope *OuterMostScope) {
....
NamedDecl *ND = dyn_cast<NamedDecl>(New);
CXXRecordDecl *ThisContext =
dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()); // <=
CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
ND && ND->isCXXInstanceMember()); // <=
....
}
Isilumkiso se-PVS-Studio: V595 [CWE-476] Isalathisi 'ND' sisetyenzisiwe ngaphambi kokuba siqinisekiswe ngokuchasene ne-nullptr. Jonga imigca: 532, 534. SemaTemplateInstantiateDecl.cpp 532
Kwaye apha:
- V595 [CWE-476] Isalathisi 'U' sasetyenziswa phambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 404, 407. DWARFormValue.cpp 404
- V595 [CWE-476] Isalathisi 'ND' sisetyenziswe phambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 2149, 2151. SemaTemplateInstantiate.cpp 2149
Kwaye ke ndiye ndangenamdla wokufunda izilumkiso ezinenombolo V595. Ke andazi ukuba kukho iimpazamo ezifanayo ngaphandle kwezi zidweliswe apha. Ngokunokwenzeka kukho.
Iqhekeza le-N17, i-N18: Ukutshintsha okukrokrisayo
static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize,
uint64_t &Encoding) {
....
unsigned Size = RegSize;
....
uint64_t NImms = ~(Size-1) << 1;
....
}
PVS-Studio isilumkiso:
Isenokungabi yimpazamo kwaye ikhowudi isebenza kanye njengoko bekucetyiwe. Kodwa ngokuqinisekileyo le yindawo ekrokrisa kakhulu kwaye kufuneka ijongwe.
Masithi ukuguquguquka ubungakanani ilingana no-16, kwaye ke umbhali wekhowudi ecetywayo ukuyifumana kwi-variable Nimms intsingiselo:
1111111111111111111111111111111111111111111111111111111111100000
Nangona kunjalo, enyanisweni umphumo uya kuba:
0000000000000000000000000000000011111111111111111111111111100000
Inyani yeyokuba zonke izibalo zenzeka kusetyenziswa uhlobo lwe-32-bit olungatyikitywanga. Kwaye kungoko kuphela, olu hlobo lwe-32-bit olungasayinwanga luyakwandiswa ngokuthe ngqo Uint64_t. Kule meko, amasuntswana abaluleke kakhulu aya kuba ngu-zero.
Ungayilungisa imeko ngolu hlobo:
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
Imeko efanayo: V629 [CWE-190] Cinga ngokuhlola ibinzana elithi 'Immr << 6'. Ukutshintsha kancinci kwexabiso le-32-bit kunye nokwandiswa okulandelayo kuhlobo lwe-64-bit. AArch64AddressingModes.h 269
Iqhekeza N19: Igama elingundoqo elilahlekileyo enye?
void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands) {
....
if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) {
// VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token.
// Skip it.
continue;
} if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) { // <=
Op.addRegWithFPInputModsOperands(Inst, 2);
} else if (Op.isDPPCtrl()) {
Op.addImmOperands(Inst, 1);
} else if (Op.isImm()) {
// Handle optional arguments
OptionalIdx[Op.getImmTy()] = I;
} else {
llvm_unreachable("Invalid operand type");
}
....
}
PVS-Studio isilumkiso:
Akukho mpazamo apha. Ukususela ngoko-block yokuqala if iphela nge uyaqhubeka, ke akunamsebenzi, kukho igama elingundoqo enye okanye hayi. Nokuba yeyiphi na indlela ikhowudi iya kusebenza ngokufanayo. Usakhumbula enye yenza ikhowudi icace ngakumbi kwaye ibe yingozi. Ukuba kwixesha elizayo uyaqhubeka iyanyamalala, ikhowudi iyakuqala ukusebenza ngokwahlukileyo ngokupheleleyo. Ngokombono wam kungcono ukongeza enye.
Iqhekeza N20: Iintlobo ezine zohlobo olufanayo
LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
std::string Result;
if (isUndefined())
Result += "(undef) ";
if (isWeakDefined())
Result += "(weak-def) ";
if (isWeakReferenced())
Result += "(weak-ref) ";
if (isThreadLocalValue())
Result += "(tlv) ";
switch (Kind) {
case SymbolKind::GlobalSymbol:
Result + Name.str(); // <=
break;
case SymbolKind::ObjectiveCClass:
Result + "(ObjC Class) " + Name.str(); // <=
break;
case SymbolKind::ObjectiveCClassEHType:
Result + "(ObjC Class EH) " + Name.str(); // <=
break;
case SymbolKind::ObjectiveCInstanceVariable:
Result + "(ObjC IVar) " + Name.str(); // <=
break;
}
OS << Result;
}
PVS-Studio izilumkiso:
- V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola i 'Isiphumo + Igama.str()' intetho. Uphawu.cpp 32
- V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola 'Isiphumo + "(Udidi lwe-ObjC)" + Igama.str()' intetho. Uphawu.cpp 35
- V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola inkcazo ethi 'Isiphumo + "(ObjC Class EH) " + Name.str()'. Uphawu.cpp 38
- V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola 'Isiphumo + "(ObjC IVar)" + Igama.str()' intetho. Uphawu.cpp 41
Ngengozi, kusetyenziswe umsebenzisi + endaweni yomsebenzisi +=. Isiphumo soyilo luyilo olungenantsingiselo.
Iqhekeza N21: Indlela yokuziphatha engachazwanga
static void getReqFeatures(std::map<StringRef, int> &FeaturesMap,
const std::vector<Record *> &ReqFeatures) {
for (auto &R : ReqFeatures) {
StringRef AsmCondString = R->getValueAsString("AssemblerCondString");
SmallVector<StringRef, 4> Ops;
SplitString(AsmCondString, Ops, ",");
assert(!Ops.empty() && "AssemblerCondString cannot be empty");
for (auto &Op : Ops) {
assert(!Op.empty() && "Empty operator");
if (FeaturesMap.find(Op) == FeaturesMap.end())
FeaturesMap[Op] = FeaturesMap.size();
}
}
}
Zama ukufumana ikhowudi eyingozi ngokwakho. Kwaye lo ngumfanekiso wokuphazamisa ingqalelo ukuze ungajongi ngokukhawuleza impendulo:
PVS-Studio isilumkiso:
Umgca wengxaki:
FeaturesMap[Op] = FeaturesMap.size();
Ukuba element Op ayifumanekanga, ngoko into entsha yenziwe kwimephu kwaye inani lezinto kule mephu libhalwe apho. Ayaziwa nje ukuba umsebenzi uya kubizwa ubungakanani phambi okanye emva kokongeza into entsha.
Iqhekeza N22-N24: Izabelo eziphindaphindiweyo
Error MachOObjectFile::checkSymbolTable() const {
....
} else {
MachO::nlist STE = getSymbolTableEntry(SymDRI);
NType = STE.n_type; // <=
NType = STE.n_type; // <=
NSect = STE.n_sect;
NDesc = STE.n_desc;
NStrx = STE.n_strx;
NValue = STE.n_value;
}
....
}
PVS-Studio isilumkiso:
Andiqondi ukuba kukho impazamo yokwenyani apha. Isabelo nje esiphindaphindiweyo esingeyomfuneko. Kodwa kusekho impazamo.
Ngokunjalo:
- V519 [CWE-563] Ukuguquguquka kwe-'B.NDesc' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 1488, 1489. llvm-nm.cpp 1489
- V519 [CWE-563] Ukuguquguquka kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Khangela imigca: 59, 61. coff2yaml.cpp 61
Iqhekeza N25-N27: Izabelo ezingakumbi
Ngoku makhe sijonge kuguqulelo olwahluke kancinane lokwabelwa ngokutsha.
bool Vectorizer::vectorizeLoadChain(
ArrayRef<Instruction *> Chain,
SmallPtrSet<Instruction *, 16> *InstructionsProcessed) {
....
unsigned Alignment = getAlignment(L0);
....
unsigned NewAlign = getOrEnforceKnownAlignment(L0->getPointerOperand(),
StackAdjustedAlignment,
DL, L0, nullptr, &DT);
if (NewAlign != 0)
Alignment = NewAlign;
Alignment = NewAlign;
....
}
Isilumkiso se-PVS-Studio: V519 [CWE-563] Ukuguquguquka 'koLungelelaniso' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 1158, 1160. LoadStoreVectorizer.cpp 1160
Le yikhowudi engaqhelekanga kakhulu ebonisa ukuba iqulethe impazamo esengqiqweni. Ekuqaleni, iyatshintsha ulungelelwaniso ixabiso labelwe ngokuxhomekeke kwimeko. Kwaye ke isabelo senzeka kwakhona, kodwa ngoku ngaphandle kwetshekhi.
Iimeko ezifanayo zinokubonwa apha:
- V519 [CWE-563] I-'Effects' variables yabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 152, 165. WebAssemblyRegStackify.cpp 165
- V519 [CWE-563] Ukuguquguquka kwe-'ExpectNoDerefChunk' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 4970, 4973. SemaType.cpp 4973
Iqhekeza N28: Ihlala ikwimeko eyinyani
static int readPrefixes(struct InternalInstruction* insn) {
....
uint8_t byte = 0;
uint8_t nextByte;
....
if (byte == 0xf3 && (nextByte == 0x88 || nextByte == 0x89 ||
nextByte == 0xc6 || nextByte == 0xc7)) {
insn->xAcquireRelease = true;
if (nextByte != 0x90) // PAUSE instruction support // <=
break;
}
....
}
PVS-Studio isilumkiso:
Ukujonga akukho ngqiqweni. Iyaguquguquka ngokulandelayoByte ayisoloko ilingana nexabiso 0x90, elandela kwitshekhi yangaphambili. Olu luhlobo oluthile lwempazamo esengqiqweni.
Iqhekeza N29 - N...: Iimeko ezihlala ziyinyani / zibubuxoki
Umhlalutyi ukhupha izilumkiso ezininzi zokuba yonke imeko (
static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
if (RegNo > 13)
return MCDisassembler::Fail;
if ((RegNo & 1) || RegNo == 0xe)
S = MCDisassembler::SoftFail;
....
}
PVS-Studio isilumkiso:
U-0xE ongatshintshiyo lixabiso 14 kwidesimali. Uviwo RegNo == 0xe ayinangqondo kuba ukuba RegNo > 13, ngoko umsebenzi uzakugqibezela ukuphunyezwa kwawo.
Kwakukho ezinye izilumkiso ezininzi nge-ID V547 kunye ne-V560, kodwa njengaku
Ndiza kukunika umzekelo wokuba kutheni ukufunda ezi zinto zibangelayo kukruqulayo. I-analyzer ichanekile ngokupheleleyo ekukhupheni isilumkiso sekhowudi elandelayo. Kodwa oku akuyompazamo.
bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
tok::TokenKind ClosingBraceKind) {
bool HasError = false;
....
HasError = true;
if (!ContinueOnSemicolons)
return !HasError;
....
}
PVS-Studio Isilumkiso: V547 [CWE-570] Inkcazo ethi '!HasError' isoloko ibubuxoki. UnwrappedLineParser.cpp 1635
Iqhekeza N30: ββUkubuya okukrokrisayo
static bool
isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg),
E = MRI.def_instr_end(); It != E; ++It) {
return (*It).isImplicitDef();
}
....
}
PVS-Studio isilumkiso:
Oku mhlawumbi yimpazamo okanye ubuchule obuthile obunenjongo yokucacisa into kubadwelisi benkqubo abafunda ikhowudi. Olu yilo aluchazi nto kum kwaye lukhangeleka lukrokra kakhulu. Kungcono ukuba ungabhali ngolo hlobo :).
Ndidiniwe? Emva koko lixesha lokwenza iti okanye ikofu.
Iziphene ezichongwe ngoxilongo olutsha
Ndicinga ukuba ukusebenza kwe-30 yokuxilongwa kwakudala kwanele. Ngoku makhe sibone ukuba zeziphi izinto ezinomdla ezinokufunyanwa ngoxilongo olutsha oluvele kuhlalutyi emva koko
Iqhekeza N31: Ikhowudi engafikelelekiyo
Error CtorDtorRunner::run() {
....
if (auto CtorDtorMap =
ES.lookup(JITDylibSearchList({{&JD, true}}), std::move(Names),
NoDependenciesToRegister, true))
{
....
return Error::success();
} else
return CtorDtorMap.takeError();
CtorDtorsByPriority.clear();
return Error::success();
}
PVS-Studio isilumkiso:
Njengoko ubona, omabini amasebe omsebenzisi if iphela ngomnxeba oya kumsebenzisi buya. Ngokufanelekileyo, isitya CtorDtorsByPriority soze icocwe.
Iqhekeza N32: Ikhowudi engafikelelekiyo
bool LLParser::ParseSummaryEntry() {
....
switch (Lex.getKind()) {
case lltok::kw_gv:
return ParseGVEntry(SummaryID);
case lltok::kw_module:
return ParseModuleEntry(SummaryID);
case lltok::kw_typeid:
return ParseTypeIdEntry(SummaryID); // <=
break; // <=
default:
return Error(Lex.getLoc(), "unexpected summary kind");
}
Lex.setIgnoreColonInIdentifiers(false); // <=
return false;
}
Isilumkiso se-PVS-Studio: V779 [CWE-561] Ikhowudi engafumanekiyo ifunyenwe. Kungenzeka ukuba kukho impazamo. LLParser.cpp 835
Imeko enomdla. Makhe sijonge le ndawo kuqala:
return ParseTypeIdEntry(SummaryID);
break;
Ekuqaleni, kubonakala ngathi akukho mpazamo apha. Kubonakala ngathi umqhubi aphule kukho enye eyongezelelweyo apha, kwaye ungayicima ngokulula. Nangona kunjalo, ayizizo zonke ezilula.
Umhlalutyi ukhupha isilumkiso kwimigca:
Lex.setIgnoreColonInIdentifiers(false);
return false;
Kwaye ngokwenene, le khowudi ayifikeleleki. Zonke iimeko kwi guqula iphela ngomnxeba osuka kumsebenzisi buya. Kwaye ngoku isidenge yedwa aphule ayibonakali ingenabungozi kangako! Mhlawumbi elinye lamasebe kufuneka liphele nge aphule, hayi kwi buya?
Iqhekeza N33: Ukusetwa kwakhona ngokungacwangciswanga kwamasuntswana aphezulu
unsigned getStubAlignment() override {
if (Arch == Triple::systemz)
return 8;
else
return 1;
}
Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
const SectionRef &Section,
bool IsCode) {
....
uint64_t DataSize = Section.getSize();
....
if (StubBufSize > 0)
DataSize &= ~(getStubAlignment() - 1);
....
}
PVS-Studio isilumkiso:
Nceda uqaphele ukuba umsebenzi getStubAlignment ibuyisela uhlobo engatyikitywanga. Masibale ixabiso lentetho, sicingela ukuba umsebenzi ubuyisela ixabiso lesi-8:
~(getStubAlignment() - 1)
~(8u-1)
0xFFFFFFFF8u
Ngoku qaphela ukuba ukuguquguquka Ubungakanani beDatha inohlobo lwe-64-bit olungatyikitywanga. Kuyavela ukuba xa usenza i-DataSize & 0xFFFFFFF8u ukusebenza, zonke iibhithi ezingamashumi amathathu anesibini eziphezulu ziya kuphinda zibekwe kwi-zero. Okunokwenzeka, ayisiyiyo le nto ibifunwa ngumdwelisi. Ndiyakrokra ukuba ebefuna ukubala: DataSize & 0xFFFFFFFFFFFFFFFFF8u.
Ukulungisa impazamo, kufuneka ubhale oku:
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
Okanye kunjalo:
DataSize &= ~(getStubAlignment() - 1ULL);
Iqhekeza N34: Aluphumelelanga ukuphoswa kohlobo olucacileyo
template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
SmallVectorImpl<T> &ScaledMask) {
assert(0 < Scale && "Unexpected scaling factor");
int NumElts = Mask.size();
ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
....
}
PVS-Studio isilumkiso:
Ukuphosa kodidi olucacileyo kusetyenziswa ukunqanda ukuphuphuma xa uphinda-phinda uhlobo oluguquguqukayo int. Nangona kunjalo, uhlobo olucacileyo lokuphosa apha alukhuseli ngokuchasene nokuphuphuma. Okokuqala, izinto eziguquguqukayo ziya kwandiswa, kwaye kuphela emva koko isiphumo se-32-bit sophindaphindo siyakwandiswa kuhlobo.
Iqhekeza N35: Ayiphumelelanga iKopi-Cola
Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
....
if (!match(Op0, m_PosZeroFP()) && isKnownNeverNaN(Op0, &TLI)) {
I.setOperand(0, ConstantFP::getNullValue(Op0->getType()));
return &I;
}
if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
I.setOperand(1, ConstantFP::getNullValue(Op0->getType())); // <=
return &I;
}
....
}
Olu vavanyo olutsha olunomdla luchonga iimeko apho isiqwenga sekhowudi siye sakhutshelwa kwaye amanye amagama kuyo aqalisile ukutshintshwa, kodwa kwindawo enye awayilungisanga.
Nceda uqaphele ukuba kwibhloko yesibini batshintshile Op0 phezu Op1. Kodwa kwenye indawo abazange bayilungise. Kunokwenzeka ukuba ibibhalwe ngolu hlobo:
if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
I.setOperand(1, ConstantFP::getNullValue(Op1->getType()));
return &I;
}
Iqhekeza N36: Ukubhideka okuguquguqukayo
struct Status {
unsigned Mask;
unsigned Mode;
Status() : Mask(0), Mode(0){};
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
Mode &= Mask;
};
....
};
PVS-Studio isilumkiso:
Kuyingozi kakhulu ukunika iingxoxo zemisebenzi amagama afanayo namalungu eklasi. Kulula kakhulu ukubhideka. Sinemeko enjalo phambi kwethu. Le ntetho ayinangqiqo:
Mode &= Mask;
Ingxoxo yomsebenzi iyatshintsha. Kuko konke. Le ngxoxo ayisasetyenziswa. Okunokwenzeka ukuba ubuyibhale ngolu hlobo:
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
this->Mode &= Mask;
};
Iqhekeza N37: Ukubhideka okuguquguqukayo
class SectionBase {
....
uint64_t Size = 0;
....
};
class SymbolTableSection : public SectionBase {
....
};
void SymbolTableSection::addSymbol(Twine Name, uint8_t Bind, uint8_t Type,
SectionBase *DefinedIn, uint64_t Value,
uint8_t Visibility, uint16_t Shndx,
uint64_t Size) {
....
Sym.Value = Value;
Sym.Visibility = Visibility;
Sym.Size = Size;
Sym.Index = Symbols.size();
Symbols.emplace_back(llvm::make_unique<Symbol>(Sym));
Size += this->EntrySize;
}
Isilumkiso PVS-Studio: V1001 [CWE-563] Uguqulo 'Ubungakanani' lwabelwe kodwa alusetyenziswa ekupheleni komsebenzi. Into.cpp 424
Imeko iyafana naleyo yangaphambili. Kufuneka kubhalwe:
this->Size += this->EntrySize;
Iqhekeza N38-N47: Balibele ukujonga isalathiso
Ngaphambili, sijonge imizekelo ye-diagnostic triggering
int getGEPCost(Type *PointeeType, const Value *Ptr,
ArrayRef<const Value *> Operands) {
....
if (Ptr != nullptr) { // <=
assert(....);
BaseGV = dyn_cast<GlobalValue>(Ptr->stripPointerCasts());
}
bool HasBaseReg = (BaseGV == nullptr);
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType()); // <=
....
}
Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi se-'Ptr' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Khangela imigca: 729, 738. TargetTransformInfoImpl.h 738
Eyahlukileyo Ptr inokulingana nullptr, njengoko kungqinwa yitshekhi:
if (Ptr != nullptr)
Nangona kunjalo, ngezantsi kwesi sikhombiso sirhoxiswa ngaphandle kokujonga kwangaphambili:
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
Makhe siqwalasele omnye umzekelo ofanayo.
llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
bool Stub) {
....
auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
SmallVector<QualType, 16> ArgTypes;
if (FD) // <=
for (const ParmVarDecl *Parm : FD->parameters())
ArgTypes.push_back(Parm->getType());
CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
....
}
Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi 'FD' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 3228, 3231. CGDebugInfo.cpp 3231
Nikela ingqalelo kumqondiso FD. Ndiqinisekile ukuba ingxaki ibonakala ngokucacileyo kwaye akukho ngcaciso ikhethekileyo efunekayo.
Kwaye ngakumbi:
static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
Value *&BasePtr,
const DataLayout &DL) {
PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
if (!PtrTy) { // <=
Result = Polynomial();
BasePtr = nullptr;
}
unsigned PointerBits =
DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace()); // <=
....
}
Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi se-'PtrTy' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 960, 965. InterleavedLoadCombinePass.cpp 965
Indlela yokuzikhusela kwiimpazamo ezinjalo? Qaphela ngakumbi kwiKhowudi-Uphononongo kwaye usebenzise i-PVS-Studio uhlalutyo lwe-static ukujonga rhoqo ikhowudi yakho.
Akukho sizathu sokukhankanya amanye amaqhekeza ekhowudi aneempazamo zolu hlobo. Ndiza kushiya kuphela uluhlu lwezilumkiso kwinqaku:
- V1004 [CWE-476] Isalathisi 'Expr' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 1049, 1078. DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] Isalathisi 'PI' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 733, 753. LegacyPassManager.cpp 753
- V1004 [CWE-476] Isalathisi se-'StatepointCall' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 4371, 4379. Verifier.cpp 4379
- V1004 [CWE-476] Isalathisi se-'RV' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 2263, 2268. TGParser.cpp 2268
- V1004 [CWE-476] Isalathisi se-'CalleeFn' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 1081, 1096. SimplifyLibCalls.cpp 1096
- V1004 [CWE-476] Isalathisi 'TC' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Khangela imigca: 1819, 1824. Driver.cpp 1824
Iqhekeza N48-N60: Ayibalulekanga, kodwa isiphene (ukuvuza kwenkumbulo okunokwenzeka)
std::unique_ptr<IRMutator> createISelMutator() {
....
std::vector<std::unique_ptr<IRMutationStrategy>> Strategies;
Strategies.emplace_back(
new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps()));
....
}
PVS-Studio isilumkiso:
Ukongeza into ekupheleni kwesikhongozeli njenge std::vector > awukwazi ukubhala nje xxx.push_back(entsha X), kuba akukho guqulelo olucacileyo ukusuka X* Π² std::yahlukileyo_ptr.
Isisombululo esiqhelekileyo kukubhala xxx.emplace_back(entsha X)kuba ihlanganisa: indlela emplace_back wakha into ngokuthe ngqo kwiingxoxo zayo kwaye ke ngoko unokusebenzisa abakhi abacacileyo.
Ayikhuselekanga. Ukuba i-vector igcwele, imemori iphinda yabiwe. Umsebenzi wokwabelwa ngokutsha inkumbulo unokusilela, okukhokelela ekubeni kuphoswe ngaphandle std::bad_alloc. Kule meko, isalathisi siya kulahleka kwaye into eyenziweyo ayinakuze icinywe.
Isisombululo esikhuselekileyo kukudala unique_ptreya kuba yeyakho isalathi phambi kokuba i-vector izame ukubeka kwakhona imemori:
xxx.push_back(std::unique_ptr<X>(new X))
Ukusukela ku-C++14, ungasebenzisa 'std::make_unique':
xxx.push_back(std::make_unique<X>())
Olu hlobo lwesiphene alubalulekanga kwi-LLVM. Ukuba imemori ayinakwabiwa, umqokeleli uya kumisa ngokulula. Nangona kunjalo, kwizicelo ezinde
Ke, nangona le khowudi ingenabungozi kwi-LLVM, ndiyifumene iluncedo ukuthetha ngale pateni yempazamo kunye nokuba umhlalutyi we-PVS-Studio ufundile ukuyichonga.
Ezinye izilumkiso zolu hlobo:
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli 'sokudlula' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. PassManejala.h 546
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwi-'AAs' isikhongozeli ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. Uhlalutyo lwe-Alias.h 324
- V1023 [CWE-460] Isalathisi esingenamnikazi siyongezwa kwisikhongozeli 'soNgeniso' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. DWARFDebugFrame.cpp 519
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'AllEdges' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. CFGMST.h 268
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwi-'VMaps' isikhongozeli ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. I-SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se'Record' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. FDRLogBuilder.h 30
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'PendingSubmodules' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. ModuleMap.cpp 810
- V1023 [CWE-460] Isalathisi esingenamnini sidityaniswe kwisikhongozeli 'Izinto' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. DebugMap.cpp 88
- V1023 [CWE-460] Isalathisi esingenamnikazi siyongezwa kwisikhongozeli 'soBuchule' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 685
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 686
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 688
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 689
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 690
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 691
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 692
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 693
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 694
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Operands' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Stash' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Matchers 'ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 2702
isiphelo
Ndakhupha izilumkiso ezingama-60 zizonke ndaza ndayeka. Ngaba zikho ezinye iziphene ezifunyanwa ngumhlalutyi we-PVS-Studio kwi-LLVM? Ewe ndinayo. Nangona kunjalo, xa ndibhala iziqwenga zekhowudi zenqaku, kwakuhlwile, okanye kunobusuku, kwaye ndaye ndagqiba ekubeni lixesha lokuyibiza ngokuba yimini.
Ndiyathemba ukuba uyifumene inomdla kwaye uya kufuna ukuzama i-PVS-Studio analyzer.
Unokukhuphela i-analyzer kwaye ufumane iqhosha le-minesweeper
Okubaluleke kakhulu, sebenzisa uhlalutyo lwe-static rhoqo. Iitshekhi zexesha elinye, olwenziwa sithi ukwenzela ukuba kuphakanyiswe indlela yohlalutyo lwe-static kunye ne-PVS-Studio ayiyona imeko eqhelekileyo.
Inhlanhla ekuphuculeni umgangatho kunye nokuthembeka kwekhowudi yakho!
Ukuba ufuna ukwabelana ngeli nqaku kunye nabaphulaphuli abathetha isiNgesi, nceda usebenzise ikhonkco lokuguqulela: Andrey Karpov.
umthombo: www.habr.com