Neke atu i te rua tau kua pahemo mai i te tirotiro waehere whakamutunga o te kaupapa LLVM ma te whakamahi i ta maatau kaitirotiro PVS-Studio. Kia mohio tatou ko te kaitirotiro PVS-Studio he taputapu matua mo te tautuhi i nga hapa me nga whakaraeraetanga pea. Ki te mahi i tenei, ka tirohia e matou ka kitea nga hapa hou i roto i te tukunga LLVM 8.0.0.
Tuhinga ka tuhia
Kia pono, kare au i pai ki te tuhi i tenei tuhinga. Ehara i te mea pai ki te tuhi mo tetahi kaupapa kua maha nga wa kua tirohia e matou (
I nga wa katoa ka tukuna, ka whakahouhia ranei he putanga hou o LLVM
Titiro, kua ako te putanga hou o Clang Static Analyzer ki te kimi hapa hou! Ki taku whakaaro kei te heke haere te whai take o te whakamahi i te PVS-Studio. Ka kitea e Clang nga hapa nui atu i mua, ka mau ki nga kaha o PVS-Studio. He aha to whakaaro mo tenei?
I nga wa katoa ka hiahia ahau ki te whakahoki kupu penei:
Kare hoki matou e noho mangere! Kua tino whakapai ake matou i nga kaha o te kaitirotiro PVS-Studio. Nō reira kaua e māharahara, kei te arahi tonu mātou i mua.
Kia aroha mai, he whakautu kino tenei. Karekau he tohu kei roto. A koinei te take i tuhia ai e au tenei tuhinga inaianei. Na, kua tirohia ano te kaupapa LLVM a kua kitea nga momo hapa i roto. Ka whakaatu ahau i nga mea i pai ki ahau. Kaore e taea e Clang Static Analyzer te kimi i enei hapa (he tino rawe ki te mahi me tana awhina). Engari ka taea e tatou. I tua atu, i kitea e ahau, i tuhia enei hapa katoa i te ahiahi kotahi.
Engari he maha nga wiki ki te tuhi i te tuhinga. Kaore au i kaha ki te whakauru i enei mea katoa ki te tuhinga :).
Ma te ara, mena kei te pirangi koe ki nga hangarau e whakamahia ana i roto i te kaitirotiro PVS-Studio ki te tautuhi i nga hapa me nga whakaraeraetanga pea, katahi ahau ka kii kia mohio koe ki tenei.
Nga tātaritanga hou me te tawhito
Ka rite ki te korero kua korerohia, e rua tau ki muri ka tirotirohia ano te kaupapa LLVM, ka whakatikahia nga hapa i kitea. Inaianei ka whakaatuhia e tenei tuhinga he puranga hou o nga hapa. He aha i kitea ai nga pepeke hou? E toru nga take mo tenei:
- Kei te tipu haere te kaupapa LLVM, te huri i te waehere tawhito me te taapiri i te waehere hou. Ko te tikanga, he hapa hou kei roto i te waehere whakarereke me te tuhi. E whakaatu marama ana tenei me whakamahi te tātaritanga pateko i nga wa katoa, kaua i etahi wa. Ko o maatau tuhinga e whakaatu pai ana i nga kaha o te kaitirotiro PVS-Studio, engari kaore he mahi ki te whakapai ake i te kounga o te waehere me te whakaiti i te utu mo te whakatika hapa. Whakamahia he kaitirotiro waehere pateko i nga wa katoa!
- Kei te whakaoti me te whakapai ake i nga tātaritanga o naianei. Na reira, ka taea e te kaitirotiro te tautuhi i nga hapa kaore i kitea e ia i nga wa o mua.
- Kua puta nga taatai hou i roto i te PVS-Studio karekau i te 2 tau ki muri. I whakatau ahau ki te whakanui i a raatau ki tetahi waahanga motuhake hei whakaatu i te whanaketanga o PVS-Studio.
Ko nga hapa i kitea e nga tātaritanga e 2 tau ki muri
Wahi N1: Tārua-Whakapiri
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
....
}
Whakatupato PVS-Studio:
Ka taki rua ka timata te ingoa ki te aho iti "avx512.mask.permvar.". I te haki tuarua, i tino hiahia ratou ki te tuhi i tetahi atu mea, engari i wareware ki te whakatika i nga tuhinga kua kapea.
Whatiwhati 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;
....
}
Whakatupato PVS-Studio: V501 He kupu-iti rite 'CXNameRange_WantQualifier' ki te taha maui me te taha matau o te '|' kaiwhakahaere. CIindex.cpp 7245
Nā te hē o te hē, ka rua te whakamahi i te pūmau rite tonu CXNameRange_WantQualifier.
Waahanga N3: Te rangirua me te mana whakahaere
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
....
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
return 0;
....
}
Whakatupato PVS-Studio:
Ki taku whakaaro, he he tino ataahua tenei. Ae, e mohio ana ahau he whakaaro kee aku mo te ataahua :).
Inaianei, e ai ki
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
Mai i te tirohanga whaitake, kaore he tikanga o taua ahuatanga, na te mea ka taea te whakaheke ki:
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
He tino he tenei. Ko te nuinga, i hiahia ratou ki te whakataurite i te 0/1 me te taurangi taupū. Hei whakatika i te waehere me taapiri koe i nga reu ki te taha o te kaiwhakahaere ternary:
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
Ma te ara, he tino kino te kaiwhakahaere ternary me te whakapataritari i nga hapa arorau. Kia tino tupato ki taua mea, kaua hoki e apo ki nga reu. I titiro atu ahau ki tenei kaupapa
Whatiwhati N4, N5: Poutohu Null
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;
}
....
}
Whakatupato PVS-Studio:
Mena ko te tohu LHS he null, me tuku he whakatupato. Engari, ka whakakorehia tenei tohu tohu kore: LHS->getAsString().
He ahuatanga tino angamaheni tenei ka hunahia he hapa i roto i te kaikawe hapa, na te mea karekau he tangata e whakamatautau ana. Ka tirohia e nga kaitirotiro pateko nga waehere katoa e taea ana, ahakoa te maha o te whakamahi. He tauira tino pai tenei mo te taapiri i te tātaritanga pateko ki etahi atu tikanga whakamatautau me te whakamarumaru hapa.
He rite te whakahaere tohu tohu RHS ka whakaaetia i roto i te waehere i raro iho nei: V522 [CWE-476] Ka taea te whakakore i te tohu tohu kore 'RHS'. TGParser.cpp 2186
Wahi N6: Te whakamahi i te atatohu i muri i te neke
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);
}
....
}
Whakatupato PVS-Studio: V522 [CWE-476] Ka taea te whakakore i te tohu tohu kore 'ProgClone'. He whakahiato.cpp 601
I te timatanga he atatohu atamai ProgClone ka mutu te pupuri i te taonga:
BD.setNewProgram(std::move(ProgClone));
Inaianei, inaianei ProgClone he tohu tohu kore. No reira, me puta he tohu tohu korekore ki raro iho:
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
Engari, i roto i te meka, e kore e tupu tenei! Kia mahara kaore i tino mahia te kapiti.
I te timatanga o te ipu Nga Mahi Mihi whakawāteatia:
MiscompiledFunctions.clear();
I muri mai, ka whakamahia te rahi o tenei ipu i roto i te ahuatanga kopikopiko:
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
He ngawari ki te kite kaore e timata te kopae. Ki taku whakaaro he bug ano tenei, me tuhi rereke te waehere.
Te ahua nei kua tutaki matou ki tera waahanga rongonui o nga hapa! Ka huna tetahi hapa ki tetahi :).
Wahi N7: Te whakamahi i te atatohu i muri i te neke
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;
}
....
}
Whakatupato PVS-Studio: V522 [CWE-476] Ka taea te whakakore i te tohu tohu 'Whakamātautau'. He whakahiato.cpp 709
Ko te ahua ano. I te tuatahi, ka nekehia nga mea o roto o te taonga, katahi ka whakamahia me te mea kaore he mea i tupu. Ka kite ahau i tenei ahuatanga i te nuinga o nga wa i roto i te waehere papatono i muri i te putanga o nga semantics nekehanga i C++. Koinei te take i pai ai ahau ki te reo C++! He maha ake nga huarahi hou ki te pupuhi i to waewae. Ka whai mahi tonu te kaitirotiro PVS-Studio :).
Whatiwhati N8: Poutohu Null
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);
}
Whakatupato PVS-Studio: V522 [CWE-476] Ka taea pea te whakakore i te tohu tohu 'Momo'. PrettyFunctionDumper.cpp 233
I tua atu i nga kaikawe hapa, karekau i te whakamatauhia nga mahi taarua. He keehi penei kei mua i a matou. Kei te tatari te mahi mo te kaiwhakamahi, ko wai, hei utu mo te whakaoti i ona raru, ka kaha ki te whakatika.
Tika:
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
Whatiwhati N9: Poutohu Null
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());
....
}
Whakatupato PVS-Studio: V522 [CWE-476] Ka taea te whakakore i te tohu tohu 'Ty'. RapuRipangaEmitter.cpp 614
Ki taku whakaaro he maamaa nga mea katoa kaore e hiahiatia he whakamaramatanga.
Whatiwhati 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;
}
Whakatupato PVS-Studio:
Kare he take ki te tautapa i tetahi taurangi ki a ia ano. Ko te nuinga pea i hiahia ratou ki te tuhi:
Identifier->Type = Question->Type;
Mahinga N11: Wehenga ohorere
void SystemZOperand::print(raw_ostream &OS) const {
switch (Kind) {
break;
case KindToken:
OS << "Token:" << getToken();
break;
case KindReg:
OS << "Reg:" << SystemZInstPrinter::getRegisterName(getReg());
break;
....
}
Whakatupato PVS-Studio:
He kaipakihi tino whakapae i te timatanga whati. I wareware koe ki te tuhi i tetahi atu mea ki konei?
Whatiwhati N12: Te taki i te atatohu i muri i te whakakorenga korero
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");
....
}
Whakatupato PVS-Studio:
Pouaka Callee i te timatanga ka whakakorehia i te wa e kiia ana te mahi tikiTTI.
Na ka puta mai me tirotirohia tenei atatohu mo te orite nullptr:
if (!Callee || Callee->isDeclaration())
Engari kua roa rawa…
Whatiwhati N13 - N...: Te taki i te atatohu i muri i te whakakorenga korero
Ko te ahuatanga i korerohia i te wahanga waehere o mua ehara i te mea ahurei. Ka puta i konei:
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()) { // <=
....
}
Whakatupato PVS-Studio: V595 [CWE-476] I whakamahia te tohu 'CalleeFn' i mua i te manatoko ki te nullptr. Tirohia nga rarangi: 1079, 1081. SimplifyLibCalls.cpp 1079
Na konei:
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()); // <=
....
}
Whakatupato PVS-Studio: V595 [CWE-476] I whakamahia te tohu 'ND' i mua i te manatoko ki te nullptr. Tirohia nga rarangi: 532, 534. SemaTemplateInstantiateDecl.cpp 532
Na konei:
- V595 [CWE-476] I whakamahia te tohu 'U' i mua i te manatoko ki te nullptr. Tirohia nga rarangi: 404, 407. DWARFormValue.cpp 404
- V595 [CWE-476] I whakamahia te tohu 'ND' i mua i te manatoko ki te nullptr. Tirohia nga rarangi: 2149, 2151. SemaTemplateInstantiate.cpp 2149
Na ka kore ahau e aro ki te ako i nga whakatupato me te nama V595. No reira kaore au i te mohio mena he maha ano nga hapa i tua atu i nga mea kua raarangi i konei. Te nuinga pea kei reira.
Whatiwhati N17, N18: Huringa hihira
static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize,
uint64_t &Encoding) {
....
unsigned Size = RegSize;
....
uint64_t NImms = ~(Size-1) << 1;
....
}
Whakatupato PVS-Studio:
Ehara pea i te pepeha me te mahi tika te waehere i te mea i whakaarohia. Engari he waahi tino hihira tenei me te tirotiro.
Me kii te taurangi Rahinga he rite ki te 16, katahi ka whakaaro te kaituhi o te waehere ki te tiki i roto i te taurangi NImms uara:
1111111111111111111111111111111111111111111111111111111111100000
Heoi, i roto i te meka ko te hua ka:
0000000000000000000000000000000011111111111111111111111111100000
Ko te meka ka puta nga tatauranga katoa ma te whakamahi i te momo 32-bit kaore i hainatia. Na anake, ko tenei momo 32-bit kaore i hainatia ka whakawhanuihia ki uint64_t. I tenei keehi, ko nga moka tino nui ka noho kore.
Ka taea e koe te whakatika i te ahuatanga penei:
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
He rite te ahuatanga: V629 [CWE-190] Whakaarohia te tirotiro i te whakaaturanga 'Immr << 6'. Te neke moka o te uara moka-32 me te roha o muri ki te momo moka-64. AArch64AddressingModes.h 269
Wahi N19: Kua ngaro te kupu matua atu?
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");
}
....
}
Whakatupato PVS-Studio:
Karekau he he i konei. Mai i tera wa-poraka o te tuatahi if mutu ki tonu, karekau he aha, he kupu matua atu kaore ranei. Ahakoa he aha te mahi o te waehere. I ngaro tonu atu ka nui ake te marama me te kino o te waehere. Mena kei te heke mai tonu ka ngaro, ka timata te mahi tino rerekee te waehere. Ki taku whakaaro he pai ake te taapiri atu.
Whatiwhati N20: E wha nga hapa o te momo rite
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;
}
Whakatupato PVS-Studio:
- V655 [CWE-480] I honoa nga aho engari kaore i whakamahia. Whakaarohia te tirotiro i te whakaaturanga 'Hua + Ingoa.str()'. Tohu.cpp 32
- V655 [CWE-480] I honoa nga aho engari kaore i whakamahia. Whakaarohia te tirotiro i te whakaaturanga 'Hua + "(ObjC Class)" + Name.str()'. Tohu.cpp 35
- V655 [CWE-480] I honoa nga aho engari kaore i whakamahia. Whakaarohia te tirotiro i te whakaaturanga 'Hua + "(ObjC Class EH) " + Name.str()'. Tohu.cpp 38
- V655 [CWE-480] I honoa nga aho engari kaore i whakamahia. Whakaarohia te tirotiro i te whakaaturanga 'Hua + "(ObjC IVar)" + Name.str()'. Tohu.cpp 41
Na te aitua, ka whakamahia te + operator hei utu mo te += operator. Ko te hua ko nga hoahoa karekau he tikanga.
Te Waahanga N21: Te whanonga kore i tautuhia
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();
}
}
}
Ngana koe ki te kimi i te waehere kino. A he pikitia tenei hei whakararu i te aro kia kore e titiro wawe ki te whakautu:
Whakatupato PVS-Studio:
Raina raruraru:
FeaturesMap[Op] = FeaturesMap.size();
Ki te huānga Op kare i kitea, katahi ka hangaia he huānga hou ki te mapi ka tuhia ki reira te maha o nga huānga o tenei mapi. Kaore i te mohiotia mena ka karangahia te mahi rahi i mua, i muri ranei i te taapiri i tetahi huānga hou.
Whatiwhati N22-N24: Taumahi tukurua
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;
}
....
}
Whakatupato PVS-Studio:
Ki taku whakaaro karekau he tino he i konei. He taumahi koretake noa. Engari he pohehe tonu.
Waihoki:
- V519 [CWE-563] Ko te taurangi 'B.NDesc' ka tohua nga uara e rua nga wa. He pohehe pea tenei. Tirohia nga rarangi: 1488, 1489. llvm-nm.cpp 1489
- V519 [CWE-563] Ko te taurangi ka tohua nga uara e rua nga wa. He pohehe pea tenei. Tirohia nga rarangi: 59, 61. coff2yaml.cpp 61
Te Waahanga N25-N27: He maha atu nga taumahinga
Inaianei ka titiro tatou ki tetahi momo rereke rereke o te whakarereke.
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;
....
}
Whakatupato PVS-Studio: V519 [CWE-563] Ko te taurangi 'Whakatikanga' ka tohua nga uara e rua nga wa. He pohehe pea tenei. Tirohia nga rarangi: 1158, 1160. LoadStoreVectorizer.cpp 1160
He waehere tino rerekee tenei he hapa arorau kei roto. I te timatanga, taurangi Tīaroaro ka tohua he uara i runga i te ahuatanga. Na ka puta ano te taumahi, engari inaianei kaore he haki.
Ka kitea nga ahuatanga penei i konei:
- V519 [CWE-563] Ko te taurangi 'Panga' ka tohaina nga uara e rua nga wa. He pohehe pea tenei. Tirohia nga rarangi: 152, 165. WebAssemblyRegStackify.cpp 165
- V519 [CWE-563] Ko te taurangi 'ExpectNoDerefChunk' ka tohua nga uara e rua nga wa. He pohehe pea tenei. Tirohia nga rarangi: 4970, 4973. SemaType.cpp 4973
Wahi N28: Tikanga pono tonu
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;
}
....
}
Whakatupato PVS-Studio:
Ko te arowhai kaore he tikanga. Taurangi Paitapa atu i nga wa katoa kaore e rite ki te uara 0x90, ka whai mai i te haki o mua. He momo hapa arorau tenei.
Whatiwhati N29 - N...: Tikanga tika/teka
He maha nga whakatupato ka tukuna e te kaitirotiro mo te ahuatanga katoa (
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;
....
}
Whakatupato PVS-Studio:
Ko te 0xE tonu te uara 14 i roto i te ira. Whakamātautau RegNo == 0xe karekau he tikanga na te mea mena Nama Rehita > 13, ka oti te mahi i tana mahi.
He maha atu nga whakatupato me nga ID V547 me V560, engari pera me
Ka hoatu e ahau he tauira mo te aha te ako i enei keu he hoha. He tino tika te kaitirotiro ki te tuku whakatupato mo te waehere e whai ake nei. Engari ehara tenei i te he.
bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
tok::TokenKind ClosingBraceKind) {
bool HasError = false;
....
HasError = true;
if (!ContinueOnSemicolons)
return !HasError;
....
}
Whakatupato PVS-Studio: V547 [CWE-570] He teka tonu te korero '!HasError'. UnwrappedLineParser.cpp 1635
Wahi N30: Te hokinga mai o te whakapae
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();
}
....
}
Whakatupato PVS-Studio:
He hapa tenei, he tikanga motuhake ranei hei whakamaarama i tetahi mea ki nga kaihōtaka e panui ana i te waehere. Kaore tenei hoahoa e whakamarama i tetahi mea ki ahau me te ahua tino whakapae. He pai ake kia kaua e tuhi penei :).
ngenge? Katahi ka tae ki te wa ki te mahi tii, kawhe ranei.
Ko nga hapa i kitea e nga tātaritanga hou
Ki taku whakaaro he 30 nga whakahohenga o nga tātaritanga tawhito kua nui. Me titiro inaianei he aha nga mea whakamere ka kitea me nga tātaritanga hou i puta mai i te kaitirotiro i muri mai
Wahi N31: Waehere kore e taea te toro atu
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();
}
Whakatupato PVS-Studio:
Ka kite koe, e rua nga peka o te kaiwhakahaere if mutu ki te waea ki te kaiwhakahaere hoki. Na, ko te ipu CtorDtorsByPriority e kore rawa e whakawāteatia.
Wahi N32: Waehere kore e taea te toro atu
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;
}
Whakatupato PVS-Studio: V779 [CWE-561] I kitea te waehere kaore e taea te toro atu. He hapa pea kei reira. LLParser.cpp 835
Te ahuatanga whakamere. Me titiro ki tenei waahi tuatahi:
return ParseTypeIdEntry(SummaryID);
break;
I te titiro tuatahi, te ahua nei kaore he hapa i konei. Ko te ahua o te kaiwhakahaere whati he mea taapiri kei konei, a ka taea e koe te muku noa. Heoi, ehara i te mea ngawari katoa.
Ka tukuna e te kaitirotiro he whakatupato i runga i nga raina:
Lex.setIgnoreColonInIdentifiers(false);
return false;
Ae, ko tenei waehere kaore e taea te toro atu. Ko nga keehi katoa kei roto whakakā ka mutu ki te waea mai i te kaiwhakahaere hoki. Na inaianei kua kore noa iho whati e kore e tino kino te ahua! Tena pea me mutu tetahi o nga manga whatikaore i runga hoki?
Whatiwhati N33: Tautuhi tupurangi o nga moka teitei
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);
....
}
Whakatupato PVS-Studio:
Kia mahara ko te mahi getStubAlignment momo hoki kāore i tohua. Me tatau tatou i te uara o te whakahuatanga, me te whakaaro ka whakahokia e te mahi te uara 8:
~(getStubAlignment() - 1)
~(8u-1)
0xFFFFFFFF8u
Inaianei tirohia te taurangi Rahi Raraunga he momo moka-64 kaore i hainatia. Te ahua nei ka mahia te Rahi Raraunga & 0xFFFFFFF8u mahi, toru tekau ma rua nga moka ota teitei ka tautuhia ki te kore. Ko te mea pea, ehara tenei i te hiahia o te kaitakaro. Ki taku whakaaro i hiahia ia ki te tatau: Rahi Raraunga & 0xFFFFFFFFFFFFFFF8u.
Hei whakatika i te hapa, me tuhi koe i tenei:
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
Ranei:
DataSize &= ~(getStubAlignment() - 1ULL);
Wahi N34: I rahua te maka momo marama
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);
....
}
Whakatupato PVS-Studio:
Ka whakamahia te maka momo marama hei karo i te puhake ina whakareatia nga momo taurangi int. Heoi, karekau te momo makanga i konei e tiaki i te waipuke. Tuatahi, ka whakareatia nga taurangi, katahi ka whakaroahia te hua moka-32 o te whakareatanga ki te momo.
Whatiwhati N35: I Rahua te Tārua-Whakapiri
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;
}
....
}
Ko tenei tātaritanga whakahihiri hou e tohu ana i nga ahuatanga kua kapehia tetahi waahanga waehere me etahi ingoa kei roto kua timata te whakarereke, engari i tetahi waahi kaore i whakatikahia.
Kia mahara mai i te poraka tuarua i rereke ratou Op0 i runga i Op1. Engari i tetahi waahi kaore ratou i whakatika. Ko te mea pea me penei te tuhi:
if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
I.setOperand(1, ConstantFP::getNullValue(Op1->getType()));
return &I;
}
Whatiwhati N36: Hurorirori kau
struct Status {
unsigned Mask;
unsigned Mode;
Status() : Mask(0), Mode(0){};
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
Mode &= Mask;
};
....
};
Whakatupato PVS-Studio:
He tino kino te hoatu i nga tautohe mahi he rite nga ingoa ki nga mema o te akomanga. He tino ngawari ki te raruraru. He keehi penei kei mua i a matou. Kare he tikanga o tenei korero:
Mode &= Mask;
Ka huri te tautohe mahi. Heoi ano. Kua kore e whakamahia tenei tohenga. Ko te mea pea kua tuhia e koe penei:
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
this->Mode &= Mask;
};
Whatiwhati N37: Hurorirori kau
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;
}
Whakatupato PVS-Studio: V1001 [CWE-563] Ko te taurangi 'Rahi' kua tautapa engari kaore e whakamahia i te mutunga o te mahi. Ahanoa.cpp 424
He rite te ahuatanga ki tera o mua. Me tuhi:
this->Size += this->EntrySize;
Wahi N38-N47: Kua wareware ratou ki te tirotiro i te taurangi
I mua, i titiro matou ki nga tauira o te whakapataritari tātaritanga
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()); // <=
....
}
Whakatupato PVS-Studio: V1004 [CWE-476] I whakamahia kino te tohu 'Ptr' i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 729, 738. TargetTransformInfoImpl.h 738
Taurangi Ptr ka rite pea nullptr, e tohuhia ana e te haki:
if (Ptr != nullptr)
Heoi, kei raro i tenei atatohu ka whakakorehia me te kore arowhai tuatahi:
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
Ka whakaarohia e tatou tetahi atu keehi penei.
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(); // <=
....
}
Whakatupato PVS-Studio: V1004 [CWE-476] I whakamahia te atatohu 'FD' i runga i te haumaru i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 3228, 3231. CGDebugInfo.cpp 3231
Kia tupato ki te tohu FD. E tino mohio ana ahau kei te tino kitea te raru, kaore he whakamarama motuhake e hiahiatia ana.
I tua atu:
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()); // <=
....
}
Whakatupato PVS-Studio: V1004 [CWE-476] Ko te tohu 'PtrTy' i whakamahia i runga i te haumaru i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 960, 965. InterleavedLoadCombinePass.cpp 965
Me pehea te tiaki i a koe mai i enei hapa? Kia kaha ake te aro ki te Arotake-Waehere me te whakamahi i te PVS-Studio tātari pateko hei tirotiro i to waehere.
Kaore he take ki te whakahua i etahi atu waahanga waehere me nga hapa o tenei momo. Ka waiho e ahau he rarangi whakatupato i roto i te tuhinga:
- V1004 [CWE-476] I whakamahia kino te tohu 'Expr' i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 1049, 1078. DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] I whakamahia kino te tohu 'PI' i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 733, 753. LegacyPassManager.cpp 753
- V1004 [CWE-476] Ko te atatohu 'StatepointCall' i whakamahia kinotia i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 4371, 4379. Verifier.cpp 4379
- V1004 [CWE-476] I whakamahia te atatohu 'RV' i runga i te haumaru i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 2263, 2268. TGParser.cpp 2268
- V1004 [CWE-476] I whakamahia kino te tohu 'CalleeFn' i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 1081, 1096. SimplifyLibCalls.cpp 1096
- V1004 [CWE-476] I whakamahia te atatohu 'TC' i runga i te haumaru i muri i tana manatoko ki te nullptr. Tirohia nga rarangi: 1819, 1824. Driver.cpp 1824
Whatiwhati N48-N60: Ehara i te mea tino nui, engari he koha (ka turuturu pea te mahara)
std::unique_ptr<IRMutator> createISelMutator() {
....
std::vector<std::unique_ptr<IRMutationStrategy>> Strategies;
Strategies.emplace_back(
new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps()));
....
}
Whakatupato PVS-Studio:
Hei taapiri i tetahi huānga ki te pito o te ipu penei std::vector > e kore e taea e koe te tuhi noa xxx.push_back(X hōu), i te mea karekau he hurihanga mai X* в std::unique_ptr.
Ko te otinga noa ko te tuhi xxx.emplace_back(X hōu)i te mea e whakahiato ana: tikanga emplace_back ka hanga tika i tetahi huānga mai i ona tohenga, na reira ka taea te whakamahi i nga kaihanga marama.
Kaore i te haumaru. Mena kua ki tonu te vector, ka tohatohahia ano te mahara. Ka rahua pea te mahi whakahuri mahara, katahi ka maka he okotahi std:: kino_alloc. I tenei take, ka ngaro te atatohu, ka kore rawa te ahanoa i hanga e mukua.
Ko te otinga haumaru ko te hanga unique_ptrkei a ia te atatohu i mua i te ngana a te vector ki te huri i te mahara:
xxx.push_back(std::unique_ptr<X>(new X))
Mai i te C++ 14, ka taea e koe te whakamahi 'std::make_unique':
xxx.push_back(std::make_unique<X>())
Ko tenei momo hapa kaore he mea nui mo LLVM. Ki te kore e taea te toha te mahara, ka mutu noa te whakahiato. Heoi, mo nga tono me te roa
Na, ahakoa karekau tenei waehere e whakatuma ki te LLVM, i kitea e au he pai ki te korero mo tenei tauira hapa, kua ako te kaitirotiro PVS-Studio ki te tautuhi.
Ko etahi atu whakatupato o tenei momo:
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Passes' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. PassManager.h 546
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'AA' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. AliasAnalysis.h 324
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Whakauru' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. DWARFDebugFrame.cpp 519
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'AllEdges' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. CFGMST.h 268
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'VMaps' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Records' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. FDRLogBuilder.h 30
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'PendingSubmodules' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. ModuleMap.cpp 810
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Anoa' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. DebugMap.cpp 88
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Rautaki' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 685
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 686
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 688
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 689
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 690
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 691
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 692
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 693
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Modifiers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. llvm-stress.cpp 694
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Operand' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Stash' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] Ka taapirihia he atatohu kaore he rangatira ki te ipu 'Matchers' ma te tikanga 'emplace_back'. Ka puta he turuturu mahara ki te mea he tuunga. GlobalISelEmitter.cpp 2702
mutunga
I tukuna e ahau nga whakatupato 60 katoa ka mutu. He aha etahi atu hapa ka kitea e te kaitirotiro PVS-Studio i LLVM? Ae, kei ahau. Heoi, i te wa e tuhi ana au i nga kongakonga waehere mo te tuhinga, kua ahiahi, he po, ka whakatau ahau kua tae ki te wa ki te karanga he ra.
Te ti'aturi nei au i kitea e koe he mea pai, ka hiahia koe ki te whakamatau i te kaitirotiro PVS-Studio.
Ka taea e koe te tango i te kaitirotiro me te tiki i te taviri minesweeper i
Ko te mea nui, whakamahia te tātari pateko i nga wa katoa. Takitahi wa, i mahia e matou ki te whakanui i te tikanga o te tātaritanga pateko me te PVS-Studio ehara i te ahuatanga noa.
Waimarie ki te whakapai ake i te kounga me te pono o to waehere!
Ki te hiahia koe ki te tiri i tenei tuhinga ki te hunga whakarongo ki te reo Ingarihi, whakamahia te hononga whakamaori: Andrey Karpov.
Source: will.com