Commit 1c4ea009 authored by Andrew Grieve's avatar Andrew Grieve Committed by Commit Bot

Android: Make proguard deobfuscation more careful about false-positives

Language tags look like class names.

Bug: 938270
Change-Id: I242104be127e450cae4690bc6e76245ad672196a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1526166
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Reviewed-by: default avatarSam Maier <smaier@chromium.org>
Reviewed-by: default avatarDavid Turner <digit@chromium.org>
Cr-Commit-Position: refs/heads/master@{#641688}
parent 672589c7
...@@ -53,25 +53,28 @@ public class FlushingReTrace { ...@@ -53,25 +53,28 @@ public class FlushingReTrace {
+ "(?:.*L%C;.*)|" + "(?:.*L%C;.*)|"
// E.g.: END SomeTestClass#someMethod // E.g.: END SomeTestClass#someMethod
+ "(?:.*?%c#%m.*?)|" + "(?:.*?%c#%m.*?)|"
// E.g.: The member "Foo.bar"
// E.g.: The class "Foobar"
+ "(?:.*?\"%c\\.%m\".*)|"
+ "(?:.*?\"%c\".*)|"
// Special-case for a common junit logcat message: // Special-case for a common junit logcat message:
// E.g.: java.lang.NoClassDefFoundError: SomeFrameworkClass in isTestClass for Foo // E.g.: java.lang.NoClassDefFoundError: SomeFrameworkClass in isTestClass for Foo
+ "(?:.* isTestClass for %c)|" + "(?:.* isTestClass for %c)|"
// E.g.: Caused by: java.lang.RuntimeException: Intentional Java Crash // E.g.: Caused by: java.lang.RuntimeException: Intentional Java Crash
+ "(?:Caused by: %c:.*)|" + "(?:Caused by: %c:.*)|"
// E.g.: java.lang.RuntimeException: Intentional Java Crash // Quoted values and lines that end with a class / class+method:
+ "(?:%c:.*)|"
// All lines that end with a class / class+method:
// E.g.: The class: Foo // E.g.: The class: Foo
// E.g.: INSTRUMENTATION_STATUS: class=Foo // E.g.: INSTRUMENTATION_STATUS: class=Foo
// E.g.: NoClassDefFoundError: SomeFrameworkClass in isTestClass for Foo // E.g.: NoClassDefFoundError: SomeFrameworkClass in isTestClass for Foo
// E.g.: Could not find class 'SomeFrameworkClass', referenced from method Foo.bar // E.g.: Could not find class 'SomeFrameworkClass', referenced from method Foo.bar
// E.g.: Could not find method SomeFrameworkMethod, referenced from method Foo.bar // E.g.: Could not find method SomeFrameworkMethod, referenced from method Foo.bar
+ "(?:.*(?:=|:\\s*|\\b)%c\\.%m)|" // E.g.: The member "Foo.bar"
+ "(?:.*(?:=|:\\s*|\\b)%c)" // E.g.: The class "Foobar"
// Be careful about matching %c without %m since language tags look like class names.
+ "(?:.*?%c\\.%m)|"
+ "(?:.*?\"%c\\.%m\".*)|"
+ "(?:.*\\b(?:[Cc]lass|[Tt]ype)\\b.*?\"%c\".*)|"
+ "(?:.*\\b(?:[Cc]lass|[Tt]ype)\\b.*?%c)|"
// E.g.: java.lang.RuntimeException: Intentional Java Crash
+ "(?:%c:.*)|"
// See if entire line matches a class name (e.g. for manual deobfuscation)
+ "(?:%c)"
+ ")"; + ")";
private static void usage() { private static void usage() {
......
...@@ -34,66 +34,68 @@ never.Deobfuscated -> NOTFOO: ...@@ -34,66 +34,68 @@ never.Deobfuscated -> NOTFOO:
""" """
TEST_DATA = [ TEST_DATA = [
"FOO", '',
"FOO.bar", 'FOO',
"Here is a FOO", 'FOO.bar',
"Here is a FOO baz", 'Here is a FOO',
"Here is a \"FOO\" baz", 'Here is a class FOO',
"Here is a \"FOO.bar\" baz", 'Here is a class FOO baz',
"Here it is: FOO", 'Here is a "FOO" baz',
"Here it is: FOO.bar", 'Here is a type "FOO" baz',
"SomeError: SomeFrameworkClass in isTestClass for FOO", 'Here is a "FOO.bar" baz',
"Here is a FOO.bar", 'SomeError: SomeFrameworkClass in isTestClass for FOO',
"Here is a FOO.bar baz", 'Here is a FOO.bar',
"END FOO#bar", 'Here is a FOO.bar baz',
"new-instance 3810 (LSome/Framework/Class;) in LFOO;", 'END FOO#bar',
"FOO: Error message", 'new-instance 3810 (LSome/Framework/Class;) in LFOO;',
"Caused by: FOO: Error message", 'FOO: Error message',
"\tat FOO.bar(PG:1)", 'Caused by: FOO: Error message',
"\t at\t FOO.bar\t (\t PG:\t 1\t )", '\tat FOO.bar(PG:1)',
("Unable to start activity ComponentInfo{garbage.in/here.test}:" '\t at\t FOO.bar\t (\t PG:\t 1\t )',
" java.lang.NullPointerException: Attempt to invoke interface method 'void" ('Unable to start activity ComponentInfo{garbage.in/here.test}:'
" FOO.bar(int,android.os.Bundle)' on a null object reference"), ' java.lang.NullPointerException: Attempt to invoke interface method'
("Caused by: java.lang.NullPointerException: Attempt to read from field" ' \'void FOO.bar(int,android.os.Bundle)\' on a null object reference'),
" 'int[] FOO.a' on a null object reference"), ('Caused by: java.lang.NullPointerException: Attempt to read from field'
"java.lang.VerifyError: FOO", ' \'int[] FOO.a\' on a null object reference'),
'java.lang.VerifyError: FOO',
('java.lang.NoSuchFieldError: No instance field a of type ' ('java.lang.NoSuchFieldError: No instance field a of type '
'Ljava/lang/Class; in class LFOO;'), 'Ljava/lang/Class; in class LFOO;'),
"NOTFOO: Object of type FOO was not destroyed...", 'NOTFOO: Object of type FOO was not destroyed...',
] ]
EXPECTED_OUTPUT = [ EXPECTED_OUTPUT = [
"this.was.Deobfuscated", '',
"this.was.Deobfuscated.someMethod", 'this.was.Deobfuscated',
"Here is a this.was.Deobfuscated", 'this.was.Deobfuscated.someMethod',
"Here is a FOO baz", 'Here is a FOO',
"Here is a \"this.was.Deobfuscated\" baz", 'Here is a class this.was.Deobfuscated',
"Here is a \"this.was.Deobfuscated.someMethod\" baz", 'Here is a class FOO baz',
"Here it is: this.was.Deobfuscated", 'Here is a "FOO" baz',
"Here it is: this.was.Deobfuscated.someMethod", 'Here is a type "this.was.Deobfuscated" baz',
"SomeError: SomeFrameworkClass in isTestClass for this.was.Deobfuscated", 'Here is a "this.was.Deobfuscated.someMethod" baz',
"Here is a this.was.Deobfuscated.someMethod", 'SomeError: SomeFrameworkClass in isTestClass for this.was.Deobfuscated',
"Here is a FOO.bar baz", 'Here is a this.was.Deobfuscated.someMethod',
"END this.was.Deobfuscated#someMethod", 'Here is a FOO.bar baz',
"new-instance 3810 (LSome/Framework/Class;) in Lthis/was/Deobfuscated;", 'END this.was.Deobfuscated#someMethod',
"this.was.Deobfuscated: Error message", 'new-instance 3810 (LSome/Framework/Class;) in Lthis/was/Deobfuscated;',
"Caused by: this.was.Deobfuscated: Error message", 'this.was.Deobfuscated: Error message',
"\tat this.was.Deobfuscated.someMethod(Deobfuscated.java:65)", 'Caused by: this.was.Deobfuscated: Error message',
("\t at\t this.was.Deobfuscated.someMethod\t " '\tat this.was.Deobfuscated.someMethod(Deobfuscated.java:65)',
"(\t Deobfuscated.java:\t 65\t )"), ('\t at\t this.was.Deobfuscated.someMethod\t '
("Unable to start activity ComponentInfo{garbage.in/here.test}:" '(\t Deobfuscated.java:\t 65\t )'),
" java.lang.NullPointerException: Attempt to invoke interface method" ('Unable to start activity ComponentInfo{garbage.in/here.test}:'
" 'void this.was.Deobfuscated.someMethod(int,android.os.Bundle)' on a null" ' java.lang.NullPointerException: Attempt to invoke interface method'
" object reference"), ' \'void this.was.Deobfuscated.someMethod(int,android.os.Bundle)\' on a'
("Caused by: java.lang.NullPointerException: Attempt to read from field" ' null object reference'),
" 'int[] this.was.Deobfuscated.mFontFamily' on a null object reference"), ('Caused by: java.lang.NullPointerException: Attempt to read from field'
' \'int[] this.was.Deobfuscated.mFontFamily\' on a null object reference'),
'java.lang.VerifyError: this.was.Deobfuscated', 'java.lang.VerifyError: this.was.Deobfuscated',
('java.lang.NoSuchFieldError: No instance field mFontFamily of type ' ('java.lang.NoSuchFieldError: No instance field mFontFamily of type '
'Ljava/lang/Class; in class Lthis/was/Deobfuscated;'), 'Ljava/lang/Class; in class Lthis/was/Deobfuscated;'),
"NOTFOO: Object of type this.was.Deobfuscated was not destroyed...", 'NOTFOO: Object of type this.was.Deobfuscated was not destroyed...',
] ]
TEST_DATA = [s + "\n" for s in TEST_DATA] TEST_DATA = [s + '\n' for s in TEST_DATA]
EXPECTED_OUTPUT = [s + "\n" for s in EXPECTED_OUTPUT] EXPECTED_OUTPUT = [s + '\n' for s in EXPECTED_OUTPUT]
class JavaDeobfuscateTest(unittest.TestCase): class JavaDeobfuscateTest(unittest.TestCase):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment