From 297f7a9db8b7d32e9d94a946352bc5b415a9bffd Mon Sep 17 00:00:00 2001 From: "michaelbai@google.com" Date: Tue, 30 Oct 2012 22:00:05 +0000 Subject: The findbugs_diff and lib. - findbugs_diff.py analyzes the org.chrome.* classes by calling findbug.py. - findbugs.py is python lib, it calls the FindBugs by different configration. The caller could configure the classes to analyze, filter, known_bugs, whether rebaseline etc. BUG=156116 Review URL: https://codereview.chromium.org/11273026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165024 0039d316-1c4b-4281-b951-d872f2087c98 --- build/android/findbugs_diff.py | 54 +++++ build/android/findbugs_filter/findbugs_exclude.xml | 15 ++ .../findbugs_filter/findbugs_known_bugs.txt | 208 ++++++++++++++++++ build/android/pylib/findbugs.py | 240 +++++++++++++++++++++ 4 files changed, 517 insertions(+) create mode 100755 build/android/findbugs_diff.py create mode 100644 build/android/findbugs_filter/findbugs_exclude.xml create mode 100644 build/android/findbugs_filter/findbugs_known_bugs.txt create mode 100755 build/android/pylib/findbugs.py (limited to 'build') diff --git a/build/android/findbugs_diff.py b/build/android/findbugs_diff.py new file mode 100755 index 0000000..eb49824 --- /dev/null +++ b/build/android/findbugs_diff.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Runs findbugs, and returns an error code if there are new warnings. +This runs findbugs with an additional flag to exclude known bugs. +To update the list of known bugs, do this: + + findbugs_diff.py --rebaseline + +Note that this is separate from findbugs_exclude.xml. The "exclude" file has +false positives that we do not plan to fix. The "known bugs" file has real +bugs that we *do* plan to fix (but haven't done so yet). + +Other options + --only-analyze used to only analyze the class you are interested. + --relase-build analyze the classes in out/Release directory. + --findbugs-args used to passin other findbugs's options. + +Run + $CHROM_SRC/third_party/findbugs/bin/findbugs -textui for details. + +""" + +import optparse +import os +import sys + +from pylib import findbugs + + +def main(argv): + if not findbugs.CheckEnvironment(): + return 1 + + parser = findbugs.GetCommonParser() + + options, _ = parser.parse_args() + + chrome_src = os.getenv('CHROME_SRC') + + if not options.base_dir: + options.base_dir = os.path.join(chrome_src, 'build', 'android', + 'findbugs_filter') + if not options.only_analyze: + options.only_analyze = 'org.chromium.-' + + return findbugs.Run(options) + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/build/android/findbugs_filter/findbugs_exclude.xml b/build/android/findbugs_filter/findbugs_exclude.xml new file mode 100644 index 0000000..e0e5f2a --- /dev/null +++ b/build/android/findbugs_filter/findbugs_exclude.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/build/android/findbugs_filter/findbugs_known_bugs.txt b/build/android/findbugs_filter/findbugs_known_bugs.txt new file mode 100644 index 0000000..daff462 --- /dev/null +++ b/build/android/findbugs_filter/findbugs_known_bugs.txt @@ -0,0 +1,208 @@ +H B ES: Comparison of String parameter using == or != in org.chromium.android_webview.test.AwSettingsTest$AwSettingsUserAgentStringTestHelper.doEnsureSettingHasValue(String) At AwSettingsTest.java +H B Nm: The class name org.chromium.content.browser.test.util.TouchUtils shadows the simple name of the superclass android.test.TouchUtils At TouchUtils.java +H C EC: Using pointer equality to compare a JavaBridgeCoercionTest$CustomType with a JavaBridgeCoercionTest$CustomType2 in org.chromium.content.browser.JavaBridgeCoercionTest.testPassJavaObject() At JavaBridgeCoercionTest.java +H D ST: Write to static field org.chromium.android_webview.test.util.TestWebServer.sInstance from instance method org.chromium.android_webview.test.util.TestWebServer.shutdown() At TestWebServer.java +H D ST: Write to static field org.chromium.content.app.SandboxedProcessService.sContext from instance method org.chromium.content.app.SandboxedProcessService.onCreate() At SandboxedProcessService.java +H V MS: org.chromium.android_webview.test.AndroidWebViewTestBase.WAIT_TIMEOUT_SECONDS isn't final but should be At AndroidWebViewTestBase.java +H V MS: org.chromium.android_webview.test.LoadDataWithBaseUrlTest.WAIT_TIMEOUT_SECONDS isn't final but should be At LoadDataWithBaseUrlTest.java +H V MS: org.chromium.content.app.AppResource.ARRAY_OFFICIAL_COMMAND_LINE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_COLORSTRIP_CORNER_RADII isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_COLORSTRIP_HEIGHT isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_COLORSTRIP_PADDING isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_COLORSTRIP_WIDTH isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_FOLD_BORDER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_FOLD_CORNER_RADII isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_FOLD_SHADOW isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_FOLD_SIZE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DIMENSION_FAVICON_SIZE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DRAWABLE_ICON_APP_ICON isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.DRAWABLE_ICON_DEFAULT_FAVICON isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_DATE_PICKER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_BUTTON_CANCEL isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_BUTTON_CONFIRM isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_CHECKBOX_SUPPRESS_DIALOGS isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_TEXT_MESSAGE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_TEXT_PROMPT isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_JS_MODAL_DIALOG_TEXT_TITLE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_MONTH_PICKER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_MONTH_YEAR_PICKERS_CONTAINER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_TIME_PICKER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.ID_YEAR_PICKER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.LAYOUT_DATE_TIME_PICKER_DIALOG isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.LAYOUT_JS_MODAL_DIALOG isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.LAYOUT_MONTH_PICKER isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.LAYOUT_MONTH_PICKER_DIALOG isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.MIPMAP_BOOKMARK_SHORTCUT_BACKGROUND isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_DATE_PICKER_DIALOG_CLEAR isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_DATE_PICKER_DIALOG_SET isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_DATE_TIME_PICKER_DIALOG_TITLE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_JS_MODAL_DIALOG_DONT_RELOAD_THIS_PAGE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_JS_MODAL_DIALOG_LEAVE_THIS_PAGE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_JS_MODAL_DIALOG_RELOAD_THIS_PAGE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_JS_MODAL_DIALOG_STAY_ON_THIS_PAGE isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_MEDIA_PLAYER_LOADING_VIDEO isn't final but should be In AppResource.java +H V MS: org.chromium.content.app.AppResource.STRING_MONTH_PICKER_DIALOG_TITLE isn't final but should be In AppResource.java +H V MS: org.chromium.content.browser.ContentViewTestBase.WAIT_TIMEOUT_SECONDS isn't final but should be At ContentViewTestBase.java +H V MS: org.chromium.content.browser.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS isn't final but should be At CallbackHelper.java +H V MS: org.chromium.content.browser.test.util.HistoryUtils.WAIT_TIMEOUT_SECONDS isn't final but should be At HistoryUtils.java +M B FS: Format string should use %n rather than \n in org.chromium.android_webview.test.AwSettingsTest.testUserAgentStringDefault() At AwSettingsTest.java +M B Nm: The class name org.chromium.android_webview.test.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.android_webview.test.R$raw doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.Manifest$permission doesn't start with an upper case letter At Manifest.java +M B Nm: The class name org.chromium.chrome.testshell.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.R$dimen doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.R$drawable doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.R$id doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.R$layout doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.R$string doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$dimen doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$drawable doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$id doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$layout doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.chrome.testshell.tests.R$string doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.Manifest$permission doesn't start with an upper case letter At Manifest.java +M B Nm: The class name org.chromium.content_shell.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.R$dimen doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.R$drawable doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.R$id doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.R$layout doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.R$string doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$dimen doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$drawable doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$id doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$layout doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.content_shell.tests.R$string doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.native_test.R$attr doesn't start with an upper case letter At R.java +M B Nm: The class name org.chromium.native_test.R$string doesn't start with an upper case letter At R.java +M B Nm: The method name org.chromium.base.test.util.ScalableTimeout.ScaleTimeout(long) doesn't start with a lower case letter At ScalableTimeout.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.android_webview.test.ArchiveTest.doArchiveTest(AwContents, String, boolean, String) At ArchiveTest.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.android_webview.test.ArchiveTest.testAutoBadPath() At ArchiveTest.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.android_webview.test.ArchiveTest.testExplicitBadPath() At ArchiveTest.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.android_webview.test.ArchiveTest.testExplicitGoodPath() At ArchiveTest.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.android_webview.test.LoadDataWithBaseUrlTest.testLoadDataWithBaseUrlAccessingFile() At LoadDataWithBaseUrlTest.java +M B RV: exceptional return value of java.io.File.delete() ignored in org.chromium.base.test.util.TestFileUtil.deleteFile(String) At TestFileUtil.java +M C IJU: TestCase org.chromium.android_webview.test.AndroidWebViewTestBase defines setUp that doesn't call super.setUp() At AndroidWebViewTestBase.java +M C IJU: TestCase org.chromium.android_webview.test.ArchiveTest defines setUp that doesn't call super.setUp() At ArchiveTest.java +M C IJU: TestCase org.chromium.chrome.testshell.ProviderBookmarkNodeTest defines setUp that doesn't call super.setUp() At ProviderBookmarkNodeTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$10.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$11.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$11.method(int) defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$11.method(int, int) defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$14$1.method(int) defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$14.getInnerObject() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$15.getInnerObject() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$17.captureThreadId() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$19.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$1Base.method(int) defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$1InnerObject.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$1Test.allowed() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$1TestObject.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$1TestReturner.getTest() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$20.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$24.allowed() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$25.allowed() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$25.disallowed() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$2Test.safe() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$2Test.unsafe() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$3Base.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$4Base.base() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$7.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$8.method2() defined in anonymous class At JavaBridgeBasicsTest.java +M C UMAC: Uncallable method org.chromium.content.browser.JavaBridgeBasicsTest$9.method() defined in anonymous class At JavaBridgeBasicsTest.java +M C USELESS_STRING: Invocation of toString on certChain in org.chromium.net.X509Util.verifyServerCertificates(byte[][], String) At X509Util.java +M D DLS: Dead store to context in org.chromium.android_webview.test.AndroidWebViewTestBase.createAwTestContainerViewOnMainSync(boolean, AwContentsClient) At AndroidWebViewTestBase.java +M D DLS: Dead store to eventTime in org.chromium.content.browser.LongPressDetectorTest$1.run() At LongPressDetectorTest.java +M D DLS: Dead store to onPageFinishedHelper in org.chromium.android_webview.test.AwSettingsTest.testLoadsImagesAutomaticallyNoPageReload() At AwSettingsTest.java +M D DLS: Dead store to prevEditableLength in org.chromium.content.browser.ImeAdapter$AdapterInputConnection.setEditableText(String, int, int, int, int) At ImeAdapter.java +M D DLS: Dead store to testUrl in org.chromium.android_webview.test.ClientOnPageFinishedTest.testOnPageFinishedNotCalledForValidSubresources() At ClientOnPageFinishedTest.java +M D DLS: Dead store to time in org.chromium.android_webview.test.util.TestWebServer.setDateHeaders(HttpResponse) At TestWebServer.java +M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_webview.test.ArchiveTest.testAutoBadPath() At ArchiveTest.java +M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_webview.test.ArchiveTest.testExplicitBadPath() At ArchiveTest.java +M D ICAST: Result of integer multiplication cast to long in org.chromium.android_webview.test.AwSettingsTest.testBlockNetworkImagesBlocksNetworkImageAndReloadInPlace() At AwSettingsTest.java +M D ICAST: Result of integer multiplication cast to long in org.chromium.android_webview.test.AwShouldIgnoreNavigationTest.clickOnLinkUsingJs(AwContents, AwShouldIgnoreNavigationTest$TestAwContentsClient) At AwShouldIgnoreNavigationTest.java +M D ICAST: integral division result cast to double or float in org.chromium.content.browser.HandleView.setOrientation(int) At HandleView.java +M D RCN: Redundant nullcheck of org.chromium.content.browser.SandboxedProcessConnection.mConnectionParams, which is known to be non-null in org.chromium.content.browser.SandboxedProcessConnection.doConnectionSetup() Redundant null check at SandboxedProcessConnection.java +M D REC: Exception is caught when Exception is not thrown in org.chromium.content.browser.test.util.UiUtils.findParentViewForIdAcrossActivities(int) At UiUtils.java +M D SF: Switch statement found in org.chromium.chrome.browser.ChromeBrowserProvider.insert(Uri, ContentValues) where one case falls through to the next case At ChromeBrowserProvider.java +M D SF: Switch statement found in org.chromium.chrome.browser.database.SQLiteCursor.fillWindow(int, CursorWindow) where default case is missing At SQLiteCursor.java +M D SF: Switch statement found in org.chromium.content.browser.ContentSettings$EventHandler$1.handleMessage(Message) where default case is missing At ContentSettings.java +M D SF: Switch statement found in org.chromium.content.browser.HandleView.onTouchEvent(MotionEvent) where default case is missing At HandleView.java +M D SF: Switch statement found in org.chromium.content.browser.ImeAdapter$AdapterInputConnection.performEditorAction(int) where default case is missing At ImeAdapter.java +M D ST: Write to static field org.chromium.android_webview.test.util.TestWebServer.sInstance from instance method new org.chromium.android_webview.test.util.TestWebServer(boolean) At TestWebServer.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeBasicsTest$21.field At JavaBridgeBasicsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.booleanField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.byteField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.charField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.customTypeField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.doubleField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.floatField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.intField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.longField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.objectField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.shortField At JavaBridgeFieldsTest.java +M D UrF: Unread public/protected field: org.chromium.content.browser.JavaBridgeFieldsTest$TestObject.stringField At JavaBridgeFieldsTest.java +M D UuF: Unused public or protected field: org.chromium.content.browser.JavaBridgeBasicsTest$19.field In JavaBridgeBasicsTest.java +M M IS: Inconsistent synchronization of org.chromium.chrome.browser.ChromeBrowserProvider.mUriMatcher; locked 87% of time Unsynchronized access at ChromeBrowserProvider.java +M M IS: Inconsistent synchronization of org.chromium.content.browser.SandboxedProcessConnection.mPID; locked 66% of time Unsynchronized access at SandboxedProcessConnection.java +M M IS: Inconsistent synchronization of org.chromium.content.browser.SandboxedProcessConnection.mService; locked 55% of time Unsynchronized access at SandboxedProcessConnection.java +M M IS: Inconsistent synchronization of org.chromium.content.browser.SandboxedProcessConnection.mServiceConnectComplete; locked 60% of time Unsynchronized access at SandboxedProcessConnection.java +M M LI: Incorrect lazy initialization and update of static field org.chromium.android_webview.test.util.TestWebServer.sReasons in org.chromium.android_webview.test.util.TestWebServer.createResponse(int) At TestWebServer.java +M M LI: Incorrect lazy initialization and update of static field org.chromium.content.browser.ContentVideoView.sContentVideoView in org.chromium.content.browser.ContentVideoView.createContentVideoView(int) At ContentVideoView.java +M M LI: Incorrect lazy initialization of static field org.chromium.net.NetworkChangeNotifier.sInstance in org.chromium.net.NetworkChangeNotifier.createInstance(Context, int) At NetworkChangeNotifier.java +M M NN: Naked notify in org.chromium.content.browser.VSyncMonitorTest$VSyncDataCollector.onVSync(VSyncMonitor, long) At VSyncMonitorTest.java +M M UG: org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.getBooleanValue() is unsynchronized, org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.setBooleanValue(boolean) is synchronized At JavaBridgeReturnValuesTest.java +M M UG: org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.getStringValue() is unsynchronized, org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.setStringValue(String) is synchronized At JavaBridgeReturnValuesTest.java +M M UW: Unconditional wait in org.chromium.content.browser.VSyncMonitorTest.testVSyncPeriod() At VSyncMonitorTest.java +M M Wa: Wait not in loop in org.chromium.content.browser.VSyncMonitorTest.testVSyncPeriod() At VSyncMonitorTest.java +M P SIC: Should org.chromium.android_webview.test.AwSettingsTest$ViewPair be a _static_ inner class? At AwSettingsTest.java +M P SIC: Should org.chromium.android_webview.test.AwShouldIgnoreNavigationTest$TestAwContentsClient$ShouldIgnoreNavigationHelper be a _static_ inner class? At AwShouldIgnoreNavigationTest.java +M P SIC: Should org.chromium.android_webview.test.TestAwContentsClient$AddMessageToConsoleHelper be a _static_ inner class? At TestAwContentsClient.java +M P SIC: Should org.chromium.android_webview.test.TestContentProvider$ProviderStateCursor be a _static_ inner class? At TestContentProvider.java +M P SIC: Should org.chromium.content.browser.ContentVideoView$ProgressView be a _static_ inner class? At ContentVideoView.java +M P SIC: Should org.chromium.content.browser.ContentViewGestureHandlerTest$GestureRecordingMotionEventDelegate$GestureEvent be a _static_ inner class? At ContentViewGestureHandlerTest.java +M P SIC: Should org.chromium.content.browser.JavaBridgeArrayCoercionTest$CustomType be a _static_ inner class? At JavaBridgeArrayCoercionTest.java +M P SIC: Should org.chromium.content.browser.JavaBridgeFieldsTest$CustomType be a _static_ inner class? At JavaBridgeFieldsTest.java +M P SIC: Should org.chromium.content.browser.JavaBridgeReturnValuesTest$CustomType be a _static_ inner class? At JavaBridgeReturnValuesTest.java +M P SIC: Should org.chromium.content.browser.PopupZoomerTest$CustomCanvasPopupZoomer be a _static_ inner class? At PopupZoomerTest.java +M P SIC: Should org.chromium.content.browser.VSyncMonitorTest$TestTimeSource be a _static_ inner class? At VSyncMonitorTest.java +M P SIC: Should org.chromium.content.browser.VSyncMonitorTest$TestView be a _static_ inner class? At VSyncMonitorTest.java +M P SIC: Should org.chromium.content.browser.VSyncMonitorTest$VSyncDataCollector be a _static_ inner class? At VSyncMonitorTest.java +M P SS: Unread field: org.chromium.android_webview.test.util.ImagePageGenerator.IMAGE_PREFIX; should this field be static? At ImagePageGenerator.java +M P SS: Unread field: org.chromium.android_webview.test.util.ImagePageGenerator.IMAGE_SUFFIX; should this field be static? At ImagePageGenerator.java +M P SS: Unread field: org.chromium.native_test.ChromeNativeTestActivity.EXTRA_RUN_IN_SUB_THREAD; should this field be static? At ChromeNativeTestActivity.java +M P SS: Unread field: org.chromium.native_test.ChromeNativeTestActivity.TAG; should this field be static? At ChromeNativeTestActivity.java +M P UPM: Private method org.chromium.chrome.browser.component.web_contents_delegate_android.WebContentsDelegateAndroid.onLoadProgressChanged(double) is never called At WebContentsDelegateAndroid.java +M P UrF: Unread field: org.chromium.content.browser.ContentViewGestureHandlerTest$MockListener.mLastFling2 At ContentViewGestureHandlerTest.java +M P UrF: Unread field: org.chromium.content.browser.ContentViewGestureHandlerTest$MockListener.mLastScroll1 At ContentViewGestureHandlerTest.java +M P UrF: Unread field: org.chromium.content.browser.ContentViewGestureHandlerTest$MockListener.mLastScroll2 At ContentViewGestureHandlerTest.java +M P UrF: Unread field: org.chromium.content.browser.ContentViewGestureHandlerTest$MockListener.mLastScrollDistanceX At ContentViewGestureHandlerTest.java +M P UrF: Unread field: org.chromium.content.browser.ContentViewGestureHandlerTest$MockListener.mLastScrollDistanceY At ContentViewGestureHandlerTest.java +M P UrF: Unread field: org.chromium.content.browser.HandleView.mHeight At HandleView.java +M P UuF: Unused field: org.chromium.content.browser.HandleView.mLongPressCallback In HandleView.java +M P UuF: Unused field: org.chromium.content.browser.JavaBridgeBasicsTest$19.privateField In JavaBridgeBasicsTest.java +M P UuF: Unused field: org.chromium.content.browser.JavaBridgeBasicsTest$23.field In JavaBridgeBasicsTest.java +M V EI2: new org.chromium.chrome.browser.FindMatchRectsDetails(int, RectF[], RectF) may expose internal representation by storing an externally mutable object into FindMatchRectsDetails.rects At FindMatchRectsDetails.java +M V EI2: org.chromium.chrome.browser.ChromeBrowserProvider$BookmarkNode.setFavicon(byte[]) may expose internal representation by storing an externally mutable object into ChromeBrowserProvider$BookmarkNode.mFavicon At ChromeBrowserProvider.java +M V EI2: org.chromium.chrome.browser.ChromeBrowserProvider$BookmarkNode.setThumbnail(byte[]) may expose internal representation by storing an externally mutable object into ChromeBrowserProvider$BookmarkNode.mThumbnail At ChromeBrowserProvider.java +M V EI2: org.chromium.content.browser.LoadUrlParams.setPostData(byte[]) may expose internal representation by storing an externally mutable object into LoadUrlParams.mPostData At LoadUrlParams.java +M V EI: org.chromium.chrome.browser.ChromeBrowserProvider$BookmarkNode.favicon() may expose internal representation by returning ChromeBrowserProvider$BookmarkNode.mFavicon At ChromeBrowserProvider.java +M V EI: org.chromium.chrome.browser.ChromeBrowserProvider$BookmarkNode.thumbnail() may expose internal representation by returning ChromeBrowserProvider$BookmarkNode.mThumbnail At ChromeBrowserProvider.java +M V MS: org.chromium.content.app.AppResource.DIMENSION_LINK_PREVIEW_OVERLAY_RADIUS isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.DRAWABLE_ICON_ACTION_BAR_SHARE isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.DRAWABLE_ICON_ACTION_BAR_WEB_SEARCH isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.DRAWABLE_LINK_PREVIEW_POPUP_OVERLAY isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_ACTION_BAR_SHARE isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_ACTION_BAR_WEB_SEARCH isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_CONTENT_VIEW_CONTENT_DESCRIPTION isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_MEDIA_PLAYER_ERROR_BUTTON isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_MEDIA_PLAYER_ERROR_TITLE isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_MEDIA_PLAYER_MESSAGE_PLAYBACK_ERROR isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.app.AppResource.STRING_MEDIA_PLAYER_MESSAGE_UNKNOWN_ERROR isn't final and can't be protected from malicious code In AppResource.java +M V MS: org.chromium.content.browser.LoadUrlParams.LOAD_TYPE_BROWSER_INITIATED_HTTP_POST should be package protected In LoadUrlParams.java +M V MS: org.chromium.content.browser.LoadUrlParams.LOAD_TYPE_DATA isn't final and can't be protected from malicious code In LoadUrlParams.java +M V MS: org.chromium.content.browser.LoadUrlParams.LOAD_TYPE_DEFAULT should be package protected In LoadUrlParams.java +M V MS: org.chromium.content.browser.LoadUrlParams.UA_OVERRIDE_INHERIT should be package protected In LoadUrlParams.java +M V MS: org.chromium.content.browser.LoadUrlParams.UA_OVERRIDE_TRUE should be package protected In LoadUrlParams.java +M X OBL: org.chromium.android_webview.test.LoadDataWithBaseUrlTest.testLoadDataWithBaseUrlAccessingFile() may fail to clean up java.io.OutputStream Obligation to clean up resource created at LoadDataWithBaseUrlTest.java:[line 290] is not discharged diff --git a/build/android/pylib/findbugs.py b/build/android/pylib/findbugs.py new file mode 100755 index 0000000..996c0ee --- /dev/null +++ b/build/android/pylib/findbugs.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python +# +# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import optparse +import os +import re +import shlex +import subprocess +import sys + + +def _PrintMessage(warnings, title, action, known_bugs_file): + if warnings: + print + print '*' * 80 + print '%s warnings.' % title + print '%s %s' % (action, known_bugs_file) + print '-' * 80 + for warning in warnings: + print warning + print '-' * 80 + print + + +def _StripLineNumbers(current_warnings): + re_line = r':\[line.*?\]$' + return [re.sub(re_line, '', x) for x in current_warnings] + + +def _DiffKnownWarnings(current_warnings_set, known_bugs_file): + with open(known_bugs_file, 'r') as known_bugs: + known_bugs_set = set(known_bugs.read().splitlines()) + + new_warnings = current_warnings_set - known_bugs_set + _PrintMessage(sorted(new_warnings), 'New', 'Please fix, or perhaps add to', + known_bugs_file) + + obsolete_warnings = known_bugs_set - current_warnings_set + _PrintMessage(sorted(obsolete_warnings), 'Obsolete', 'Please remove from', + known_bugs_file) + + count = len(new_warnings) + len(obsolete_warnings) + if count: + print '*** %d FindBugs warning%s! ***' % (count, 's' * (count > 1)) + if len(new_warnings): + print '*** %d: new ***' % len(new_warnings) + if len(obsolete_warnings): + print '*** %d: obsolete ***' % len(obsolete_warnings) + print + print 'Alternatively, rebaseline with --rebaseline command option' + print + else: + print 'No new FindBugs warnings.' + print + return count + + +def _Rebaseline(current_warnings_set, known_bugs_file): + with file(known_bugs_file, 'w') as known_bugs: + for warning in sorted(current_warnings_set): + print >>known_bugs, warning + return 0 + + +def _GetChromeClasses(release_version): + chrome_src = os.getenv('CHROME_SRC') + version = 'Debug' + if release_version: + version = 'Release' + path = os.path.join(chrome_src, 'out', version) + cmd = 'find %s -name "*.class"' % path + proc = subprocess.Popen(shlex.split(cmd), + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = proc.communicate() + + if not out: + print 'No classes found in %s' % path + return out + + +def _Run(exclude, known_bugs, classes_to_analyze, auxiliary_classes, + rebaseline, release_version, findbug_args): + """Run the FindBugs. + + Args: + exclude: the exclude xml file, refer to FindBugs's -exclude command option. + known_bugs: the text file of known bugs. The bugs in it will not be + reported. + classes_to_analyze: the list of classes need to analyze, refer to FindBug's + -onlyAnalyze command line option. + auxiliary_classes: the classes help to analyze, refer to FindBug's + -auxclasspath command line option. + rebaseline: True if the known_bugs file needs rebaseline. + release_version: True if the release version needs check, otherwise check + debug version. + findbug_args: addtional command line options needs pass to Findbugs. + """ + + chrome_src = os.getenv('CHROME_SRC') + sdk_root = os.getenv('ANDROID_SDK_ROOT') + sdk_version = os.getenv('ANDROID_SDK_VERSION') + + system_classes = [] + system_classes.append(os.path.join(sdk_root, 'platforms', + 'android-%s' % sdk_version, 'android.jar')) + if auxiliary_classes: + for classes in auxiliary_classes: + system_classes.append(os.path.abspath(classes)) + + cmd = '%s -textui -sortByClass ' % os.path.join(chrome_src, 'third_party', + 'findbugs', 'bin', 'findbugs') + cmd = '%s -pluginList %s' % (cmd, os.path.join(chrome_src, 'tools', 'android', + 'findbugs_plugin', 'lib', + 'chromiumPlugin.jar')) + if len(system_classes): + cmd = '%s -auxclasspath %s ' % (cmd, ':'.join(system_classes)) + + if classes_to_analyze: + cmd = '%s -onlyAnalyze %s ' % (cmd, classes_to_analyze) + + if exclude: + cmd = '%s -exclude %s ' % (cmd, os.path.abspath(exclude)) + + if findbug_args: + cmd = '%s %s ' % (cmd, fingbug_args) + + + chrome_classes = _GetChromeClasses(release_version) + if not chrome_classes: + return 1 + cmd = '%s %s ' % (cmd, chrome_classes) + + proc = subprocess.Popen(shlex.split(cmd), + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = proc.communicate() + current_warnings_set = set(_StripLineNumbers(filter(None, out.splitlines()))) + + if rebaseline: + return _Rebaseline(current_warnings_set, known_bugs) + else: + return _DiffKnownWarnings(current_warnings_set, known_bugs) + +def Run(options): + exclude_file = None + known_bugs_file = None + + if options.exclude: + exclude_file = options.exclude + elif options.base_dir: + exclude_file = os.path.join(options.base_dir, 'findbugs_exclude.xml') + + if options.known_bugs: + known_bugs_file = options.known_bugs + elif options.base_dir: + known_bugs_file = os.path.join(options.base_dir, 'findbugs_known_bugs.txt') + + auxclasspath = None + if options.auxclasspath: + auxclasspath = options.auxclasspath.split(':') + return _Run(exclude_file, known_bugs_file, options.only_analyze, auxclasspath, + options.rebaseline, options.release_build, options.findbug_args) + + +def GetCommonParser(): + parser = optparse.OptionParser() + parser.add_option('-r', + '--rebaseline', + action='store_true', + dest='rebaseline', + help='Rebaseline known findbugs issues.') + + parser.add_option('-a', + '--auxclasspath', + action='store', + default=None, + dest='auxclasspath', + help='Set aux classpath for analysis.') + + parser.add_option('-o', + '--only-analyze', + action='store', + default=None, + dest='only_analyze', + help='Only analyze the given classes and packages.') + + parser.add_option('-e', + '--exclude', + action='store', + default=None, + dest='exclude', + help='Exclude bugs matching given filter.') + + parser.add_option('-k', + '--known-bugs', + action='store', + default=None, + dest='known_bugs', + help='Not report the bugs in the given file.') + + parser.add_option('-l', + '--release-build', + action='store_true', + dest='release_build', + help='Analyze release build instead of debug.') + + parser.add_option('-f', + '--findbug-args', + action='store', + default=None, + dest='findbug_args', + help='Additional findbug arguments.') + + parser.add_option('-b', + '--base-dir', + action='store', + default=None, + dest='base_dir', + help='Base directory for configuration file.') + + return parser + +def CheckEnvironment(): + if not (os.getenv('CHROME_SRC') and os.getenv('ANDROID_SDK_ROOT') and + os.getenv('ANDROID_SDK_VERSION')): + print 'Your build environment is not set up correctly.' + print 'Please source build/android/envsetup.sh.' + return False + return True + +def main(argv): + parser = GetCommonParser() + options, _ = parser.parse_args() + + return Run(options) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) -- cgit v1.1