diff options
author | Gabor Horvath <xazax.hun@gmail.com> | 2015-12-01 09:00:41 +0000 |
---|---|---|
committer | Gabor Horvath <xazax.hun@gmail.com> | 2015-12-01 09:00:41 +0000 |
commit | fe2c0ff942e8c9f407b2e669d366eb855ba0e127 (patch) | |
tree | 84ee9c786953ecccbed0a18c36864ad444d42650 /clang/lib/StaticAnalyzer | |
parent | b4a09278533a26371d89572f376bb75ff605240b (diff) | |
download | bcm5719-llvm-fe2c0ff942e8c9f407b2e669d366eb855ba0e127.tar.gz bcm5719-llvm-fe2c0ff942e8c9f407b2e669d366eb855ba0e127.zip |
[analyzer] Fix IssueHash generation.
Differential Revision: http://reviews.llvm.org/D14919
Original patch by: Gyorgy Orban!
llvm-svn: 254394
Diffstat (limited to 'clang/lib/StaticAnalyzer')
4 files changed, 15 insertions, 12 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp b/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp index acf00041365..2eef1688d4c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp @@ -230,11 +230,12 @@ public: if (!N) return; + const LangOptions &Opts = C.getLangOpts(); const SourceManager &SM = C.getSourceManager(); FullSourceLoc FL(S->getLocStart(), SM); std::string HashContent = GetIssueString(SM, FL, getCheckName().getName(), BT->getCategory(), - C.getLocationContext()->getDecl()); + C.getLocationContext()->getDecl(), Opts); C.emitReport(llvm::make_unique<BugReport>(*BT, HashContent, N)); } diff --git a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp index 86eab41a4cc..183acbe1d91 100644 --- a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp +++ b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp @@ -255,8 +255,8 @@ void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D, os << "\n<!-- FUNCTIONNAME " << declName << " -->\n"; os << "\n<!-- ISSUEHASHCONTENTOFLINEINCONTEXT " - << GetIssueHash(SMgr, L, D.getCheckName(), D.getBugType(), DeclWithIssue) - << " -->\n"; + << GetIssueHash(SMgr, L, D.getCheckName(), D.getBugType(), DeclWithIssue, + PP.getLangOpts()) << " -->\n"; os << "\n<!-- BUGLINE " << LineNumber diff --git a/clang/lib/StaticAnalyzer/Core/IssueHash.cpp b/clang/lib/StaticAnalyzer/Core/IssueHash.cpp index abe20d6774f..0a3af3dcc7e 100644 --- a/clang/lib/StaticAnalyzer/Core/IssueHash.cpp +++ b/clang/lib/StaticAnalyzer/Core/IssueHash.cpp @@ -127,14 +127,13 @@ static StringRef GetNthLineOfFile(llvm::MemoryBuffer *Buffer, int Line) { } static std::string NormalizeLine(const SourceManager &SM, FullSourceLoc &L, - const Decl *D) { + const LangOptions &LangOpts) { static StringRef Whitespaces = " \t\n"; - const LangOptions &Opts = D->getASTContext().getLangOpts(); StringRef Str = GetNthLineOfFile(SM.getBuffer(L.getFileID(), L), L.getExpansionLineNumber()); unsigned col = Str.find_first_not_of(Whitespaces); - + col++; SourceLocation StartOfLine = SM.translateLineCol(SM.getFileID(L), L.getExpansionLineNumber(), col); llvm::MemoryBuffer *Buffer = @@ -145,7 +144,7 @@ static std::string NormalizeLine(const SourceManager &SM, FullSourceLoc &L, const char *BufferPos = SM.getCharacterData(StartOfLine); Token Token; - Lexer Lexer(SM.getLocForStartOfFile(SM.getFileID(StartOfLine)), Opts, + Lexer Lexer(SM.getLocForStartOfFile(SM.getFileID(StartOfLine)), LangOpts, Buffer->getBufferStart(), BufferPos, Buffer->getBufferEnd()); size_t NextStart = 0; @@ -175,20 +174,23 @@ static llvm::SmallString<32> GetHashOfContent(StringRef Content) { std::string clang::GetIssueString(const SourceManager &SM, FullSourceLoc &IssueLoc, StringRef CheckerName, StringRef BugType, - const Decl *D) { + const Decl *D, + const LangOptions &LangOpts) { static StringRef Delimiter = "$"; return (llvm::Twine(CheckerName) + Delimiter + GetEnclosingDeclContextSignature(D) + Delimiter + llvm::utostr(IssueLoc.getExpansionColumnNumber()) + Delimiter + - NormalizeLine(SM, IssueLoc, D) + Delimiter + BugType) + NormalizeLine(SM, IssueLoc, LangOpts) + Delimiter + BugType) .str(); } SmallString<32> clang::GetIssueHash(const SourceManager &SM, FullSourceLoc &IssueLoc, StringRef CheckerName, StringRef BugType, - const Decl *D) { + const Decl *D, + const LangOptions &LangOpts) { + return GetHashOfContent( - GetIssueString(SM, IssueLoc, CheckerName, BugType, D)); + GetIssueString(SM, IssueLoc, CheckerName, BugType, D, LangOpts)); } diff --git a/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp index 2bf439477b0..3e428fa9224 100644 --- a/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ b/clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -399,7 +399,7 @@ void PlistDiagnostics::FlushDiagnosticsImpl( *SM); const Decl *DeclWithIssue = D->getDeclWithIssue(); EmitString(o, GetIssueHash(*SM, L, D->getCheckName(), D->getBugType(), - DeclWithIssue)) + DeclWithIssue, LangOpts)) << '\n'; // Output information about the semantic context where |