aboutsummaryrefslogtreecommitdiffstats
path: root/tools/checkhf.pl
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2017-04-08 19:34:24 +0200
committerMichael Mann <mmann78@netscape.net>2017-04-08 19:14:00 +0000
commitf1751ef22fc9877e59fad3b1c60826bff8569d94 (patch)
tree78baa38910c7a9c7e4951efe6625a629efe4de72 /tools/checkhf.pl
parent6d204e51520d3b5013e5acf319eb01cef6fab0a3 (diff)
checkhf: handle C++-style comments
"tools/checkhf.pl epan/dissectors/packet-umts_fp.c" gave this error: Complex regular subexpression recursion limit (32766) exceeded at tools/checkhf.pl line 273. This is caused by the comment "// ... Indicator's ..." which failed to match the single-quoted string and caused "catastrophic backtracking". Solution to fix this case is to disallow unescaped newlines (add "\n" to the negated character class). Additionally, add logic to remove C++-style comments for completeness. Tested against all epan/dissectors/packet-*.c files, the only difference in output is this umts_fp case, the running time has not regressed. Change-Id: I7b43e01e1580acf831c0485513135b613bb02e8b Reported-by: Joerg Mayer Reviewed-on: https://code.wireshark.org/review/20965 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'tools/checkhf.pl')
-rwxr-xr-xtools/checkhf.pl30
1 files changed, 21 insertions, 9 deletions
diff --git a/tools/checkhf.pl b/tools/checkhf.pl
index 93bcb316a5..5059374474 100755
--- a/tools/checkhf.pl
+++ b/tools/checkhf.pl
@@ -235,6 +235,18 @@ sub remove_blank_lines {
return;
}
+sub get_quoted_str_regex {
+ # A regex which matches double-quoted strings.
+ # 's' modifier added so that strings containing a 'line continuation'
+ # ( \ followed by a new-line) will match.
+ my $double_quoted_str = qr{ (?: ["] (?: \\. | [^\"\\\n])* ["]) }xmso;
+
+ # A regex which matches single-quoted strings.
+ my $single_quoted_str = qr{ (?: ['] (?: \\. | [^\'\\\n])* [']) }xmso;
+
+ return qr{ $double_quoted_str | $single_quoted_str }xmso;
+}
+
# ------------
# action: remove comments from input string
# arg: code_ref, filename
@@ -250,6 +262,13 @@ sub remove_comments {
${$code_ref} =~ s{ $c_comment_regex } {}xmsog;
+ # Remove single-line C++-style comments. Be careful not to break up strings
+ # like "coap://", so match double quoted strings, single quoted characters,
+ # division operator and other characters before the actual "//" comment.
+ my $quoted_str = get_quoted_str_regex();
+ my $cpp_comment_regex = qr{ ^((?: $quoted_str | /(?!/) | [^'"/\n] )*) // .*$ }xm;
+ ${$code_ref} =~ s{ $cpp_comment_regex } { $1 }xmg;
+
($debug == 1) && print "==> After Remove Comments: code: [$filename]\n${$code_ref}\n===<\n";
return;
@@ -262,15 +281,8 @@ sub remove_comments {
sub remove_quoted_strings {
my ($code_ref, $filename) = @_;
- # A regex which matches double-quoted strings.
- # 's' modifier added so that strings containing a 'line continuation'
- # ( \ followed by a new-line) will match.
- my $double_quoted_str = qr{ (?: ["] (?: \\. | [^\"\\])* ["]) }xmso;
-
- # A regex which matches single-quoted strings.
- my $single_quoted_str = qr{ (?: ['] (?: \\. | [^\'\\])* [']) }xmso;
-
- ${$code_ref} =~ s{ $double_quoted_str | $single_quoted_str } {}xmsog;
+ my $quoted_str = get_quoted_str_regex();
+ ${$code_ref} =~ s{ $quoted_str } {}xmsog;
($debug == 1) && print "==> After Remove quoted strings: code: [$filename]\n${$code_ref}\n===<\n";