void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) { // Only register the matchers for C++; the functionality currently does not // provide any benefit to other languages, despite being benign. if (!getLangOpts().CPlusPlus) return; const auto EndCall = callExpr( callee(functionDecl(hasAnyName("remove", "remove_if", "unique"))), hasArgument( 1, anyOf(cxxConstructExpr(has(ignoringImplicit( cxxMemberCallExpr(callee(cxxMethodDecl(hasName("end")))) .bind("end")))), anything()))) .bind("alg"); const auto DeclInStd = type(hasUnqualifiedDesugaredType( tagType(hasDeclaration(decl(isInStdNamespace()))))); Finder->addMatcher( cxxMemberCallExpr( on(anyOf(hasType(DeclInStd), hasType(pointsTo(DeclInStd)))), callee(cxxMethodDecl(hasName("erase"))), argumentCountIs(1), hasArgument(0, has(ignoringImplicit( anyOf(EndCall, has(ignoringImplicit(EndCall)))))), unless(isInTemplateInstantiation())) .bind("erase"), this); }
void CSearchList::KademliaSearchKeyword(uint32 searchID, const Kademlia::CUInt128* fileID, LPCTSTR name, uint32 size, LPCTSTR type, UINT numProperties, ...) { va_list args; va_start(args, numProperties); EUtf8Str eStrEncode = utf8strRaw; CSafeMemFile* temp = new CSafeMemFile(250); uchar fileid[16]; fileID->toByteArray(fileid); temp->WriteHash16(fileid); temp->WriteUInt32(0); // client IP temp->WriteUInt16(0); // client port // write tag list UINT uFilePosTagCount = (UINT)temp->GetPosition(); uint32 tagcount = 0; temp->WriteUInt32(tagcount); // dummy tag count, will be filled later // standard tags CTag tagName(FT_FILENAME, name); tagName.WriteTagToFile(temp, eStrEncode); tagcount++; CTag tagSize(FT_FILESIZE, size); tagSize.WriteTagToFile(temp, eStrEncode); tagcount++; if (type != NULL && type[0] != _T('\0')) { CTag tagType(FT_FILETYPE, type); tagType.WriteTagToFile(temp, eStrEncode); tagcount++; } // additional tags while (numProperties-- > 0) { UINT uPropType = va_arg(args, UINT); LPCSTR pszPropName = va_arg(args, LPCSTR); LPVOID pvPropValue = va_arg(args, LPVOID); if (uPropType == 2 /*TAGTYPE_STRING*/) { if ((LPCTSTR)pvPropValue != NULL && ((LPCTSTR)pvPropValue)[0] != _T('\0')) { if (strlen(pszPropName) == 1) { CTag tagProp((uint8)*pszPropName, (LPCTSTR)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); } else { CTag tagProp(pszPropName, (LPCTSTR)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); } tagcount++; } } else if (uPropType == 3 /*TAGTYPE_UINT32*/) { if ((uint32)pvPropValue != 0) { CTag tagProp(pszPropName, (uint32)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); tagcount++; } } else { ASSERT(0); } } va_end(args); temp->Seek(uFilePosTagCount, SEEK_SET); temp->WriteUInt32(tagcount); temp->SeekToBegin(); CSearchFile* tempFile = new CSearchFile(temp, eStrEncode == utf8strRaw, searchID, 0, 0, 0, true); AddToList(tempFile); delete temp; }