Index: clang/test/Analysis/exploded-graph-rewriter/l_name_starts_with_l.cpp
===================================================================
--- /dev/null
+++ clang/test/Analysis/exploded-graph-rewriter/l_name_starts_with_l.cpp
@@ -0,0 +1,26 @@
+// CAUTION: The name of this file should start with `l` for proper tests.
+// 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 %t.dot | FileCheck %s
+// REQUIRES: asserts
+
+void test1() {
+ // Here __FILE__ macros produces a string with `\` delimiters on Windows
+ // and the name of the file starts with `l`.
+ char text[] = __FILE__;
+}
+
+void test2() {
+ // Here `\l` is in the middle of the literal.
+ char text[] = "string\\literal";
+}
+
+void test() {
+ test1();
+ test2();
+}
+
+// This test is passed if exploded_graph_rewriter handles dot file without errors.
+// CHECK: digraph "ExplodedGraph"
Index: clang/utils/analyzer/exploded-graph-rewriter.py
===================================================================
--- clang/utils/analyzer/exploded-graph-rewriter.py
+++ clang/utils/analyzer/exploded-graph-rewriter.py
@@ -368,8 +368,7 @@
self.root_id = node_id
# Note: when writing tests you don't need to escape everything,
# even though in a valid dot file everything is escaped.
- node_label = result.group(2).replace('\\l', '') \
- .replace(' ', '') \
+ node_label = result.group(2).replace(' ', '') \
.replace('\\"', '"') \
.replace('\\{', '{') \
.replace('\\}', '}') \
@@ -378,6 +377,13 @@
.replace('\\<', '\\\\<') \
.replace('\\>', '\\\\>') \
.rstrip(',')
+ # Handle `\l` separately because a string literal can be in code
+ # like "string\\literal" with the `\l` inside.
+ # Also on Windows macros __FILE__ produces specific delimiters `\`
+ # and a directory or file may starts with the letter `l`.
+ # Find all `\l` (like `,\l`, `}\l`, `[\l`) except `\\l`,
+ # because the literal as a rule containes multiple `\` before `\l`.
+ node_label = re.sub(r'(?', '>') \
- .replace('\\l', '
') \
.replace('|', '\\|')
+ s = re.sub(r'(?', s)
if self._gray_mode:
s = re.sub(r'', '', s)
s = re.sub(r'', '', s)