diff --git a/clang/include/clang/Basic/JsonSupport.h b/clang/include/clang/Basic/JsonSupport.h --- a/clang/include/clang/Basic/JsonSupport.h +++ b/clang/include/clang/Basic/JsonSupport.h @@ -13,7 +13,7 @@ #include "clang/Basic/SourceManager.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/raw_ostream.h" - +#include namespace clang { @@ -98,7 +98,16 @@ if (AddBraces) Out << "{ "; std::string filename(PLoc.getFilename()); -#ifdef _WIN32 // Handle windows-specific path delimiters. +#ifdef _WIN32 + // Remove forbidden Windows path characters + auto RemoveIt = + std::remove_if(filename.begin(), filename.end(), [](auto Char) { + static const char ForbiddenChars[] = "<>*?\"|"; + return std::find(std::begin(ForbiddenChars), std::end(ForbiddenChars), + Char) != std::end(ForbiddenChars); + }); + filename.erase(RemoveIt, filename.end()); + // Handle windows-specific path delimiters. std::replace(filename.begin(), filename.end(), '\\', '/'); #endif Out << "\"line\": " << PLoc.getLine() diff --git a/clang/test/Analysis/exploded-graph-rewriter/win_path_forbidden_chars.cpp b/clang/test/Analysis/exploded-graph-rewriter/win_path_forbidden_chars.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/exploded-graph-rewriter/win_path_forbidden_chars.cpp @@ -0,0 +1,20 @@ +// FIXME: Figure out how to use %clang_analyze_cc1 with our lit.local.cfg. +// RUN: %clang_cc1 -analyze -triple x86_64-unknown-linux-gnu \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-dump-egraph=%t.dot %s +// RUN: %exploded_graph_rewriter --verbose %t.dot 2>&1 | FileCheck %s +// REQUIRES: asserts +// UNSUPPORTED: !windows + +// Angle brackets shall not be presented in the field `file`, +// because exploded_graph_rewriter handles it as a file path +// and such symbols are forbidden on Windows platform. + +void test() { + // This produces angle brackets. + char text[] = __FILE__; +} + +// This test is passed if exploded_graph_rewriter handles dot file without errors. +// CHECK: DEBUG:root:Line: digraph "Exploded Graph" +// CHECK: \"file\": \"scratch space\"