ASDenysPetrov created this revision. ASDenysPetrov added reviewers: NoQ, vsavchenko. ASDenysPetrov added a project: clang. Herald added subscribers: cfe-commits, Charusso, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun.
Handle `\l` separately for Windows, because macros `__FILE__` produces Windows specific delimiters `\` and sometimes it happens when directory name starts from the letter `l`. Fix: Use regex on Windows for replacing all `\l` (like `,\l`, `}\l`, `[\l`) except `\\l`, because `__FILE__` containes multiple `\` before `\l` and it helps to distinguish this case. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D82092 Files: clang/test/Analysis/exploded-graph-rewriter/l_directory_from_l/win_file_macros.cpp clang/utils/analyzer/exploded-graph-rewriter.py 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,15 @@ .replace('\\<', '\\\\<') \ .replace('\\>', '\\\\>') \ .rstrip(',') + # Handle `\l` separately for Windows, because macros __FILE__ produces + # Windows specific delimiters `\` and sometimes it happens + # when directory name starts with the letter `l`. + if sys.platform == 'win32': + # Find all `\l` (like `,\l`, `}\l`, `[\l`) except `\\l`, + # because __FILE__ containes multiple `\` before `\l`. + node_label = re.sub(r'(?<!\\)\\l', '', node_label) + else: + node_label = node_label.replace('\\l', '') logging.debug(node_label) json_node = json.loads(node_label) self.nodes[node_id].construct(node_id, json_node) Index: clang/test/Analysis/exploded-graph-rewriter/l_directory_from_l/win_file_macros.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/exploded-graph-rewriter/l_directory_from_l/win_file_macros.cpp @@ -0,0 +1,28 @@ +// 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 +// UNSUPPORTED: !windows + +// This test checks a special case when `\l` can be not only as a new-line symbol, +// but as a start of the directory name on Windows platform. +// This occures when using __FILE__ macros. + +extern void __assert_fail (__const char *__assertion, __const char *__file, + unsigned int __line, __const char *__function) + __attribute__ ((__noreturn__)); +#define assert(expr) \ + ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__)) + +int test1(int i) +{ + //Here `assert` produces angle brackets and uses __FILE__ macros. + assert(i); + return i; +} + +// 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,15 @@ .replace('\\<', '\\\\<') \ .replace('\\>', '\\\\>') \ .rstrip(',') + # Handle `\l` separately for Windows, because macros __FILE__ produces + # Windows specific delimiters `\` and sometimes it happens + # when directory name starts with the letter `l`. + if sys.platform == 'win32': + # Find all `\l` (like `,\l`, `}\l`, `[\l`) except `\\l`, + # because __FILE__ containes multiple `\` before `\l`. + node_label = re.sub(r'(?<!\\)\\l', '', node_label) + else: + node_label = node_label.replace('\\l', '') logging.debug(node_label) json_node = json.loads(node_label) self.nodes[node_id].construct(node_id, json_node) Index: clang/test/Analysis/exploded-graph-rewriter/l_directory_from_l/win_file_macros.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/exploded-graph-rewriter/l_directory_from_l/win_file_macros.cpp @@ -0,0 +1,28 @@ +// 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 +// UNSUPPORTED: !windows + +// This test checks a special case when `\l` can be not only as a new-line symbol, +// but as a start of the directory name on Windows platform. +// This occures when using __FILE__ macros. + +extern void __assert_fail (__const char *__assertion, __const char *__file, + unsigned int __line, __const char *__function) + __attribute__ ((__noreturn__)); +#define assert(expr) \ + ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__)) + +int test1(int i) +{ + //Here `assert` produces angle brackets and uses __FILE__ macros. + assert(i); + return i; +} + +// This test is passed if exploded_graph_rewriter handles dot file without errors. +// CHECK: digraph "ExplodedGraph" +
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits