1 <?xml version="1.0" encoding="UTF-8"?>
   2 <!--   
   3    Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   4    
   5    DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   6    
   7    The contents of this file are subject to the terms of either the Universal Permissive License 
   8    v 1.0 as shown at http://oss.oracle.com/licenses/upl
   9    
  10    or the following license:
  11    
  12    Redistribution and use in source and binary forms, with or without modification, are permitted
  13    provided that the following conditions are met:
  14    
  15    1. Redistributions of source code must retain the above copyright notice, this list of conditions
  16    and the following disclaimer.
  17    
  18    2. Redistributions in binary form must reproduce the above copyright notice, this list of
  19    conditions and the following disclaimer in the documentation and/or other materials provided with
  20    the distribution.
  21    
  22    3. Neither the name of the copyright holder nor the names of its contributors may be used to
  23    endorse or promote products derived from this software without specific prior written permission.
  24    
  25    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
  26    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  27    FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  28    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  30    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  31    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
  32    WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33 -->
  34 <FindBugsFilter>
  35     <!-- Skip I18n -->
  36     <Match>
  37         <Bug pattern="DM_DEFAULT_ENCODING"/>
  38     </Match>
  39     <Match>
  40         <Bug pattern="DM_CONVERT_CASE"/>
  41     </Match>
  42     
  43 	<!-- Allowing Eclipse plug-in style singleton default instances -->
  44 	<Match>
  45 		<Class name="~org\.openjdk\.jmc\..*Plugin" />
  46 		<Method name="&lt;init&gt;" />
  47 		<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
  48 	</Match>
  49 
  50 	<!-- Allow tri state Boolean methods in these framework methods, i.e. the 
  51 		methods are used by the framework, and known to work with null values. -->
  52 	<Match>
  53 		<Class
  54 			name="org.openjdk.jmc.console.ui.notification.tab.RuleCheckedStateProvider" />
  55 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  56 	</Match>
  57 	<Match>
  58 		<Class name="org.openjdk.jmc.console.ui.misc.CompositeSupport" />
  59 		<Method name="getBoolean" />
  60 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  61 	</Match>
  62 	<Match>
  63 		<Class name="org.openjdk.jmc.console.ui.classes.model.ClassLoaderInstance" />
  64 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  65 	</Match>
  66 	<Match>
  67 		<Class name="~org.openjdk.jmc.ui.checkedstate..*" />
  68 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  69 	</Match>
  70 	<Match>
  71 		<Class name="org.openjdk.jmc.rjmx.triggers.fields.internal.Field" />
  72 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  73 	</Match>
  74 	<Match>
  75 		<Class name="org.openjdk.jmc.flightrecorder.ui.views.types.TypeCheckedStateProvider" />
  76 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  77 	</Match>
  78 	<Match>
  79 		<Class name="org.openjdk.jmc.flightrecorder.internal.parser.v1.StructTypes$JfrMethod" />
  80 		<Method name="isNative" />
  81 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  82 	</Match>
  83 	<Match>
  84 		<Class name="org.openjdk.jmc.flightrecorder.internal.parser.v1.StructTypes$JfrOldObject" />
  85 		<Method name="isRoot" />
  86 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  87 	</Match>
  88 	
  89 	<!-- Just internal helper method -->
  90 	<Match>
  91 		<Class name="org.openjdk.jmc.rjmx.internal.ConnectionCapabilitiesToolkit" />
  92 		<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  93 	</Match>
  94 
  95 	<!-- State changed in volatile. Signal used to stop wait and speed up thread 
  96 		end. -->
  97 	<Match>
  98 		<Class name="org.openjdk.jmc.console.ui.common.PollManager" />
  99 		<Method name="stopIfNotStopped" />
 100 		<Bug pattern="NN_NAKED_NOTIFY" />
 101 	</Match>
 102 	<Match>
 103 		<Class name="org.openjdk.jmc.ui.polling.PollManager" />
 104 		<Or>
 105 			<Method name="stopIfNotStopped" />
 106 			<Method name="poll" />
 107 		</Or>
 108 		<Bug pattern="NN_NAKED_NOTIFY" />
 109 	</Match>
 110 
 111 	<!-- Reference comparisons known to be okay, and in performance critical 
 112 		areas -->
 113 	<Match>
 114 		<Class
 115 			name="org.openjdk.jmc.flightrecorder.ui.components.chart.model.FilteredFLRIterator" />
 116 		<Method name="skipForward" />
 117 		<Bug pattern="ES_COMPARING_STRINGS_WITH_EQ" />
 118 	</Match>
 119 
 120 	<!-- Plain false positive -->
 121 	<Match>
 122 		<Class name="org.openjdk.jmc.components.ui.settings.IconEditor" />
 123 		<Method name="fillPixel" />
 124 		<Bug pattern="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE" />
 125 	</Match>
 126 
 127 	<!-- === Level 16 nitpicks and higher === -->
 128 	<!-- Eclipse uses a rather smart way to handle NSL that rubs FindBugs the 
 129 		wrong way -->
 130 	<Match>
 131 		<Class name="~.*\.Messages" />
 132 		<Bug pattern="MS_SHOULD_BE_FINAL" />
 133 	</Match>
 134 
 135 	<!-- The exit command which, obviously, works as advertised. The version command
 136 		displays version info and exits. These commands are available from JMCs
 137 		internal command console, and only affects the client. I.e, they are not
 138 		remote commands. -->
 139 	<Match>
 140 		<Or>
 141 			<Class name="org.openjdk.jmc.commands.internal.executables.Exit" />
 142 			<Class name="org.openjdk.jmc.commands.internal.executables.Version" />
 143 		</Or>
 144 		<Method name="execute" />
 145 		<Bug pattern="DM_EXIT" />
 146 	</Match>
 147 
 148 	<!-- Used for best effort in-memory size determination. If we get a better 
 149 		way to determine this, say perf counters we will change this. Note that this 
 150 		is done in the JMC GUI, not in any framework code that may be used by third 
 151 		party (server) consumers. -->
 152 	<Match>
 153 		<Class name="org.openjdk.jmc.flightrecorder.ui.FlightRecordingEditor" />
 154 		<Bug pattern="DM_GC" />
 155 	</Match>
 156 
 157 	<!-- Also intended exit - user wanted to quit on start up -->
 158 	<Match>
 159 		<Class name="org.openjdk.jmc.rcp.application.RCPApplicationIDESupport$1" />
 160 		<Method name="run" />
 161 		<Bug pattern="DM_EXIT" />
 162 	</Match>
 163 
 164 	<!-- Optimized equals(), since we know it will only be compared to this 
 165 		type... -->
 166 	<Match>
 167 		<Class
 168 			name="org.openjdk.jmc.flightrecorder.internal.parser.binary.factories.EqualityProxy" />
 169 		<Bug pattern="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" />
 170 	</Match>
 171 
 172 	<!-- Exception ignored on purpose, trying to determine what ciphers can 
 173 		be used for PBE -->
 174 	<Match>
 175 		<Class name="org.openjdk.jmc.ui.common.security.DefaultSecurityManager" />
 176 		<Bug pattern="DE_MIGHT_IGNORE" />
 177 	</Match>
 178 
 179 	<!-- Our own framework clone -->
 180 	<Match>
 181 		<Class name="org.openjdk.jmc.console.ui.profiler.exception.Template" />
 182 		<Bug pattern="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" />
 183 	</Match>
 184 	<Match>
 185 		<Class name="org.openjdk.jmc.console.ui.profiler.method.Template" />
 186 		<Bug pattern="CN_IDIOM_NO_SUPER_CALL" />
 187 	</Match>
 188 	<Match>
 189 		<Class name="org.openjdk.jmc.joverflow.support.ClassAndOvhdComboList" />
 190 		<Bug pattern="CN_IDIOM_NO_SUPER_CALL" />
 191 	</Match>
 192 	<Match>
 193 		<Class name="org.openjdk.jmc.joverflow.support.ClassAndSizeComboList" />
 194 		<Bug pattern="CN_IDIOM_NO_SUPER_CALL" />
 195 	</Match>
 196 
 197 	<!-- Class representing a profiled exception -->
 198 	<Match>
 199 		<Class
 200 			name="org.openjdk.jmc.console.ui.profiler.exception.ProfiledException" />
 201 		<Bug pattern="NM_CLASS_NOT_EXCEPTION" />
 202 	</Match>
 203 
 204 	<!-- Ignoring mockup classes -->
 205 	<Match>
 206 		<Class name="~org\.openjdk\.jmc\.rjmx\.mockup\..*" />
 207 	</Match>
 208 
 209 	<!-- Ignoring directory creation problem, as the code path for the actual 
 210 		logging will hit the problem and display an error -->
 211 	<Match>
 212 		<Class name="org.openjdk.jmc.rcp.logging.LoggingToolkit" />
 213 		<Method name="createFolders" />
 214 		<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
 215 	</Match>
 216 
 217 	<!-- Will never do nothing but reference comparisons of these. Only equal 
 218 		when the same. -->
 219 	<Match>
 220 		<Class name="org.openjdk.jmc.ui.layout.SimpleLayout$CalculationData" />
 221 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 222 	</Match>
 223 
 224 	<!-- Reversing the order of compare is in this case very deliberate, and 
 225 		in fact the whole point. The framework is for visualizing data in tables, 
 226 		and for instance used by tables to change the sort order of the content. -->
 227 	<Match>
 228 		<Class name="org.openjdk.jmc.ui.model.fields.Field" />
 229 		<Bug pattern="RV_NEGATING_RESULT_OF_COMPARETO" />
 230 	</Match>
 231 
 232 	<!-- There will be no nodes that are duplicates and should be equal when 
 233 		the instances are not the exact same. Could possibly microoptimize by having 
 234 		a better hash code, but may be confusing to not also implement equals. -->
 235 	<Match>
 236 		<Class
 237 			name="org.openjdk.jmc.flightrecorder.ui.components.graph.TreeNodeWrapper" />
 238 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 239 	</Match>
 240 
 241 	<!-- We only sort these instances using compareTo(), not to mention they 
 242 		are mutable - there is no hashCode better than the default. -->
 243 	<Match>
 244 		<Class name="org.openjdk.jmc.rjmx.triggers.TriggerRule" />
 245 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 246 	</Match>
 247 	<Match>
 248 		<Class
 249 			name="org.openjdk.jmc.flightrecorder.ui.components.graph.renderer.RenderLayoutData" />
 250 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 251 	</Match>
 252 
 253 	<!-- We need to execute equals on these instances but since they are mutable 
 254 		we can not provide a good hashCode implementation. -->
 255 	<Match>
 256 		<Class name="org.openjdk.jmc.ui.dial.ImageDescription" />
 257 		<Bug pattern="HE_EQUALS_USE_HASHCODE" />
 258 	</Match>
 259 	<Match>
 260 		<Class name="org.openjdk.jmc.ui.dial.DialViewer$Range" />
 261 		<Bug pattern="HE_EQUALS_USE_HASHCODE" />
 262 	</Match>
 263 
 264 	<!-- === The following are in experimental plug-ins === -->
 265 	<!-- Increments of the volatile are always by the same thread (from the 
 266 		run method), either directly or indirectly. -->
 267 	<Match>
 268 		<Class name="org.openjdk.jmc.test.services.applications.ExceptionThrower" />
 269 		<Bug pattern="VO_VOLATILE_INCREMENT" />
 270 		<Method name="run" />
 271 	</Match>
 272 	<Match>
 273 		<Class name="org.openjdk.jmc.test.services.ServiceThread" />
 274 		<Bug pattern="VO_VOLATILE_INCREMENT" />
 275 		<Method name="updateStatistics" />
 276 	</Match>
 277 
 278 	<!-- We only sort these instances using compareTo(), not to mention they 
 279 		are mutable - there is no hashCode better than the default. -->
 280 	<Match>
 281 		<Class name="org.openjdk.jmc.pde.PluginReference" />
 282 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 283 	</Match>
 284 
 285 	<!-- === JOverflow === -->
 286 	<!-- These are ok exit calls for the code to run JOverflow in stand-alone 
 287 		mode -->
 288 	<Match>
 289 		<Or>
 290 			<Class name="org.openjdk.jmc.joverflow.ui.FxMain" />
 291 			<Class name="org.openjdk.jmc.joverflow.ui.FxMain$1" />
 292 		</Or>
 293 		<Bug pattern="DM_EXIT" />
 294 	</Match>
 295 
 296 	<!-- These are injected by the framework through special annotations, and 
 297 		will be initialized. -->
 298 	<Match>
 299 		<Class name="org.openjdk.jmc.joverflow.ui.JOverflowFxUi" />
 300 		<Method name="&lt;init&gt;" />
 301 		<Bug pattern="UR_UNINIT_READ" />
 302 	</Match>
 303 
 304 	<Match>
 305 		<Class name="org.openjdk.jmc.joverflow.Main" />
 306 		<Bug pattern="DM_EXIT" />
 307 	</Match>
 308 
 309 	<!-- We only sort these instances using compareTo(), and never use them 
 310 		where equals() can be used -->
 311 	<Match>
 312 		<Class name="org.openjdk.jmc.joverflow.support.ClassAndSizeCombo" />
 313 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 314 	</Match>
 315 	<Match>
 316 		<Class name="org.openjdk.jmc.joverflow.heap.model.Root" />
 317 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 318 	</Match>
 319 	<Match>
 320 		<Class name="org.openjdk.jmc.joverflow.heap.model.Root$1" />
 321 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 322 	</Match>
 323 	<Match>
 324 		<Or>
 325 			<Class name="org.openjdk.jmc.joverflow.batch.ReferencedObjCluster$Collections" />
 326 			<Class name="org.openjdk.jmc.joverflow.batch.ReferencedObjCluster$DupArrays" />
 327 			<Class name="org.openjdk.jmc.joverflow.batch.ReferencedObjCluster$DupStrings" />
 328 			<Class name="org.openjdk.jmc.joverflow.batch.ReferencedObjCluster$HighSizeObjects" />
 329 			<Class name="org.openjdk.jmc.joverflow.batch.ReferencedObjCluster$WeakHashMaps" />
 330 		</Or>
 331 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 332 	</Match>
 333 
 334 	<!-- Increments of the volatile are always by the same thread (from the 
 335 		run method), either directly or indirectly. -->
 336 	<Match>
 337 		<Class name="org.openjdk.jmc.joverflow.heap.parser.CachedReadBuffer" />
 338 		<Bug pattern="VO_VOLATILE_INCREMENT" />
 339 		<Method name="get" />
 340 	</Match>
 341 	<!-- Used as best effort cache size determination -->
 342 	<Match>
 343 		<Class name="org.openjdk.jmc.joverflow.ui.model.ModelLoader" />
 344 		<Bug pattern="DM_GC" />
 345 	</Match>
 346 
 347 	<!-- Experimental/benchmarking code is ok to use explicit System.gc() -->
 348 	<Match>
 349 		<Class name="org.openjdk.jmc.joverflow.heap.parser.CachedReadBuffer" />
 350 		<Bug pattern="DM_GC" />
 351 		<Method name="determineCacheSizeFromFreeMem" />
 352 	</Match>
 353 	<Match>
 354 		<Class name="org.openjdk.jmc.joverflow.agent.MemoryTracker$1" />
 355 		<Bug pattern="DM_GC" />
 356 		<Method name="run" />
 357 	</Match>
 358 
 359 	<!-- Optimized equals() - proper type checks are done in the callee method -->
 360 	<Match>
 361 		<Class
 362 			name="org.openjdk.jmc.joverflow.support.RefChainElementImpl$AbstractElement" />
 363 		<Method name="equals" />
 364 		<Bug pattern="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" />
 365 	</Match>
 366 
 367 	<!-- A shared object does change (gets initialized), but FindBugs cannot 
 368 		recognize that. -->
 369 	<Match>
 370 		<Class name="org.openjdk.jmc.joverflow.PhoneHome$ConnectThread" />
 371 		<Method name="run" />
 372 		<Bug pattern="NN_NAKED_NOTIFY" />
 373 	</Match>
 374 	
 375 	<!-- JOverflow: Fire and forget model loaders. -->
 376 	<Match>
 377 		<Class name="org.openjdk.jmc.joverflow.ui.FxMain" />
 378 		<Method name="start" />
 379 		<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
 380 	</Match>
 381 	<Match>
 382 		<Class name="org.openjdk.jmc.joverflow.ui.JOverflowEditor" />
 383 		<Method name="createScene" />
 384 		<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
 385 	</Match>
 386 	
 387 	<!-- JOverflow: Unread public field. May be used in the future. -->
 388 	<Match>
 389 		<Class name="org.openjdk.jmc.joverflow.support.CompressibleStringStats" />
 390 		<Field name="nBackingCharArrays" />
 391 		<Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" />
 392 	</Match>
 393 	<Match>
 394 		<Class name="org.openjdk.jmc.joverflow.support.DupStringStats" />
 395 		<Field name="nBackingCharArrays" />
 396 		<Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" />
 397 	</Match>
 398 	<!-- JOverflow: Uncalled debug method. -->
 399 	<Match>
 400 		<Class name="org.openjdk.jmc.joverflow.heap.parser.CachedReadBuffer" />
 401 		<Method name="checkListConsistency" />
 402 		<Bug pattern="UPM_UNCALLED_PRIVATE_METHOD" />
 403 	</Match>
 404 	<!-- JOverflow: Unused debug counters. -->
 405 	<Match>
 406 		<Class name="org.openjdk.jmc.joverflow.heap.parser.CachedReadBuffer" />
 407 		<Or>
 408 			<Field name="numReads" />
 409 			<Field name="numPageSwaps" />
 410 			<Field name="lastReadPos" />
 411 			<Field name="numChanges" />
 412 		</Or>
 413 		<Bug pattern="UUF_UNUSED_FIELD" />
 414 	</Match>
 415 	<Match>
 416 		<Class name="org.openjdk.jmc.joverflow.stats.HeapScaner" />
 417 		<Method name="analyzeViaAllObjectsEnum" />
 418 		<Bug pattern="DLS_DEAD_LOCAL_STORE" />
 419 	</Match>
 420 	<!-- JOverflow explicit null returned instead of empty array. -->
 421 	<Match>
 422 		<Class name="org.openjdk.jmc.joverflow.descriptors.AbstractCollectionDescriptor" />
 423 		<Method name="getKnownAndPrimitiveFieldIndices" />
 424 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 425 	</Match>
 426 	<Match>
 427 		<Or>
 428 			<Class name="org.openjdk.jmc.joverflow.heap.parser.ReadBuffer$CachedReadBufferFactory" />
 429 			<Class name="org.openjdk.jmc.joverflow.heap.parser.ReadBuffer$MmappedBufferFactory" />
 430 		</Or>
 431 		<Method name="getFileImageBytes" />
 432 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 433 	</Match>
 434 	<Match>
 435 		<Class name="org.openjdk.jmc.joverflow.stats.BreadthFirstHeapScanner" />
 436 		<Method name="getNewFrontier" />
 437 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 438 	</Match>
 439 	<Match>
 440 		<Class name="org.openjdk.jmc.joverflow.util.StringInterner" />
 441 		<Or>
 442 			<Method name="internStringArrayContents" />
 443 			<Method name="internStringsInObjectArray" />
 444 		</Or>
 445 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 446 	</Match>
 447 
 448 	<!-- JOverflow examples code: Explicitly never written fields. -->
 449 	<Match>
 450 		<Class name="examples.FixableIssues$DeadFieldHolder" />
 451 		<Field name="dataField" />
 452 		<Bug pattern="UWF_UNWRITTEN_FIELD" />
 453 	</Match>
 454 	<!-- JOverflow examples code: Unread fields. -->
 455 	<Match>
 456 		<Or>
 457 			<Class name="examples.DuplicateArrays" />
 458 			<Class name="examples.DuplicateStrings" />
 459 			<Class name="examples.FixableIssues" />
 460 			<Class name="examples.VariousIssues" />
 461 			<Class name="examples.VariousIssues2" />
 462 			<Class name="examples.VariousIssues3" />
 463 		</Or>
 464 		<Method name="main" />
 465 		<Bug pattern="DLS_DEAD_LOCAL_STORE" />
 466 	</Match>
 467 	<Match>
 468 		<Class name="examples.VariousIssues$RefBackToKey" />
 469 		<Bug pattern="URF_UNREAD_FIELD" />
 470 	</Match>
 471 	<Match>
 472 		<Or>
 473 			<Class name="examples.VariousIssues2$CustomRef1" />
 474 			<Class name="examples.VariousIssues2$CustomRef2" />
 475 			<Class name="examples.VariousIssues2$LLElementP" />
 476 		</Or>
 477 		<Field name="ref" />
 478 		<Bug pattern="URF_UNREAD_FIELD" />
 479 	</Match>
 480 	<!-- JOverflow examples code: Explicit string duplication. -->
 481 	<Match>
 482 		<Class name="examples.DuplicateStrings" />
 483 		<Method name="duplicateStringShallow" />
 484 		<Bug pattern="DM_STRING_CTOR" />
 485 	</Match>
 486 	<!-- JOverflow examples code: Explicit string duplication. -->
 487 	<Match>
 488 		<Class name="examples.VariousIssues" />
 489 		<Bug pattern="DM_GC" />
 490 	</Match>
 491 	<!-- JOverflow test code: Unread fields. -->
 492 	<Match>
 493 		<Class name="org.openjdk.jmc.joverflow.stats.VariousIssueTest3" />
 494 		<Method name="testVariousIssues" />
 495 		<Bug pattern="DLS_DEAD_LOCAL_STORE" />
 496 	</Match>
 497 	<Match>
 498 		<Class name="org.openjdk.jmc.joverflow.heap.model.TestJavaObjectTable" />
 499 		<Method name="testIteratingUnvisitedObjects" />
 500 		<Bug pattern="UC_USELESS_OBJECT" />
 501 	</Match>
 502 	<!-- JOverflow test code: VM shutdown. -->
 503 	<Match>
 504 		<Class name="examples.VariousIssues" />
 505 		<Method name="&lt;init&gt;" />
 506 		<Bug pattern="DM_EXIT" />
 507 	</Match>
 508 
 509 	<!-- JDP test code: VM shutdown. -->
 510 	<Match>
 511 		<Class name="org.openjdk.jmc.jdp.ServerTester" />
 512 		<Or>
 513 			<Method name="main" />
 514 			<Method name="createName" />
 515 			<Method name="createAgentUrl" />
 516 		</Or>
 517 		<Bug pattern="DM_EXIT" />
 518 	</Match>
 519 
 520 	<!-- === Filtering out test classes right now === -->
 521 	<Match>
 522 		<Class name="~.*\.test\..*" />
 523 	</Match>
 524 	<Match>
 525 		<Class name="~.*\.uitest\..*" />
 526 	</Match>
 527 	<Match>
 528 		<Class name="~.*Test" />
 529 	</Match>
 530 	<Match>
 531 		<Class name="~.*Test\$.*" />
 532 	</Match>
 533 	<Match>
 534 		<Class name="org.openjdk.jmc.ui.checkedstate.TreeContentProvider" />
 535 	</Match>
 536 
 537 	<!-- === Filtering out classes we do not own === -->
 538 	<!-- The sun classes are only included as part of an internal JConsole plug-in 
 539 		used for testing. -->
 540 	<Match>
 541 		<Class name="~sun\.tools\..*" />
 542 	</Match>
 543 	<Match>
 544 		<Class name="~com\.sun\..*" />
 545 	</Match>
 546 
 547 	<!-- === Findbugs rank 17 === -->
 548 	<!-- Filtering out due to nearly always false positives, and no negative 
 549 		side effects except possibly for readability. -->
 550 	<Match>
 551 		<Bug pattern="REC_CATCH_EXCEPTION" />
 552 		<Rank value="17" />
 553 	</Match>
 554 	<!-- Filtering out due to nearly always false positives (does not respect 
 555 		an implementation of an API may change, and that it is the API not the current 
 556 		implementation that should be analyzed), and no negative side effects except 
 557 		possibly for readability. -->
 558 	<Match>
 559 		<Bug pattern="BC_VACUOUS_INSTANCEOF" />
 560 		<Rank value="17" />
 561 	</Match>
 562 
 563 	<!-- Instance sequence number. All instances created from the same thread. -->
 564 	<Match>
 565 		<Class name="~org\.openjdk\.jmc\.browser\.attach\.LocalConnectionDescriptor" />
 566 		<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
 567 	</Match>
 568 
 569 	<!-- Spotbugs says exception can't be thrown, but many of the attach API calls 
 570 	     before are declaring exceptions. -->
 571 	<Match>
 572 		<Class name="org.openjdk.jmc.browser.attach.LocalJVMToolkit$2" />
 573 		<Bug pattern="REC_CATCH_EXCEPTION" />
 574 	</Match>
 575 
 576 	<!-- Spotbugs says vm is guaranteed to be null at L394. Perhaps it depends on 
 577 		JDK version, but it should indeed be able to be non-null. -->
 578 	<Match>
 579 		<Class name="org.openjdk.jmc.browser.attach.LocalJVMToolkit$3" />
 580 		<Bug pattern="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH" />
 581 	</Match>
 582 
 583 	<!-- These are okay, since we never write to individual elements in the 
 584 		array. The array is always substituted for an entirely new array. -->
 585 	<Match>
 586 		<Class name="org.openjdk.jmc.console.ui.tabs.memory.MemoryPoolModel" />
 587 		<Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" />
 588 	</Match>
 589 	<Match>
 590 		<Class name="org.openjdk.jmc.console.ui.tabs.threads.ThreadsModel" />
 591 		<Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" />
 592 	</Match>
 593 	<Match>
 594 		<Class name="org.openjdk.jmc.ui.misc.ProgressCircle" />
 595 		<Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" />
 596 	</Match>
 597 	<Match>
 598 		<Class name="org.openjdk.jmc.ui.fields.FieldToolkit" />
 599 		<Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" />
 600 	</Match>
 601 
 602 	<!-- The super class is an rt.jar class. Can't override. Then again, we 
 603 		know we only use our subclasses, so ok. -->
 604 	<Match>
 605 		<Class
 606 			name="org.openjdk.jmc.rjmx.subscription.internal.AttributeExceptionEvent" />
 607 		<Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS" />
 608 	</Match>
 609 
 610 	<!-- The equals implementation of the superclass is valid for the subclass 
 611 		too -->
 612 	<Match>
 613 		<Class
 614 			name="org.openjdk.jmc.rjmx.subscription.internal.CompositeFileMRIMetadata" />
 615 		<Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS" />
 616 	</Match>
 617 
 618 	<!-- The equals and hashCode implementation of the superclass is valid for the subclass 
 619 		too -->
 620 	<Match>
 621 		<Class
 622 			name="org.openjdk.jmc.rjmx.services.internal.HotSpot24DiagnosticCommandService$DiagnosticCommandParameter" />
 623 		<Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS" />
 624 	</Match>
 625 
 626 	<!-- It's a helper class with information that may be useful in the future -->
 627 	<Match>
 628 		<Class
 629 			name="org.openjdk.jmc.rjmx.ui.internal.AttributeFieldTableSectionPart$DashboardEntry" />
 630 		<Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" />
 631 	</Match>
 632 
 633 	<!-- It's an optimization. See comment. -->
 634 	<Match>
 635 		<Class name="org.openjdk.jmc.ui.common.util.FilterMatcher" />
 636 		<Field name="lastPattern" />
 637 		<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
 638 	</Match>
 639 
 640 	<!-- One can argue that this class does not need to have all those protected 
 641 		methods. One could even argue that the class should be final. TODO: check this. -->
 642 	<Match>
 643 		<Class name="org.openjdk.jmc.rcp.start.MCMain" />
 644 		<Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" />
 645 	</Match>
 646 
 647 	<!-- In these cases the wait is used as a sleep. One may argue that there 
 648 		are better ways, but it is indeed correct. -->
 649 	<Match>
 650 		<Class name="~.*PollManager.*" />
 651 		<Bug pattern="UW_UNCOND_WAIT " />
 652 	</Match>
 653 
 654 	<!-- False positives -->
 655 	<Match>
 656 		<Class name="org.openjdk.jmc.common.parsing.Token" />
 657 		<Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" />
 658 	</Match>
 659 	<Match>
 660 		<Class name="org.openjdk.jmc.rjmx.ui.column.AsyncService" />
 661 		<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
 662 	</Match>
 663 	<Match>
 664 		<Class
 665 			name="org.openjdk.jmc.flightrecorder.ui.components.operativeset.model.EventToolkit" />
 666 		<Bug pattern="BIT_SIGNED_CHECK" />
 667 	</Match>
 668 	<Match>
 669 		<Class name="org.openjdk.jmc.rjmx.triggers.internal.NotificationTrigger" />
 670 		<Bug pattern="BIT_SIGNED_CHECK" />
 671 	</Match>
 672 	<Match>
 673 		<Class name="org.openjdk.jmc.rjmx.internal.KnownObjectNames" />
 674 		<Bug pattern="DE_MIGHT_IGNORE" />
 675 	</Match>
 676 	<Match>
 677 		<Class name="org.openjdk.jmc.rjmx.internal.MCMBeanServerConnection" />
 678 		<Method name="tryRegisteringListener" />
 679 		<Bug pattern="DE_MIGHT_IGNORE" />
 680 	</Match>
 681 	<Match>
 682 		<Class name="org.openjdk.jmc.rjmx.internal.MCMBeanServerConnection" />
 683 		<Method name="tryRemoveListener" />
 684 		<Bug pattern="DE_MIGHT_IGNORE" />
 685 	</Match>
 686 	<Match>
 687 		<Class
 688 			name="org.openjdk.jmc.rjmx.subscription.internal.SyntheticAttributeToolkit" />
 689 		<Bug pattern="DE_MIGHT_IGNORE" />
 690 	</Match>
 691 	<Match>
 692 		<Class
 693 			name="org.openjdk.jmc.rjmx.subscription.internal.HotSpotLiveSetAttribute" />
 694 		<Bug pattern="DE_MIGHT_IGNORE" />
 695 	</Match>
 696 	<Match>
 697 		<Class name="org.openjdk.jmc.console.ui.coherence.jmx.util.CoherenceModel" />
 698 		<Method name="closeAndIgnore" />
 699 		<Bug pattern="DE_MIGHT_IGNORE" />
 700 	</Match>
 701 	<Match>
 702 		<Class name="org.openjdk.jmc.ui.formpage.FormPageContribution" />
 703 		<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
 704 	</Match>
 705 
 706 	<!-- Yes, we want to be able to control sort order. The code is correct. -->
 707 	<Match>
 708 		<Class name="org.openjdk.jmc.rjmx.ui.column.ColumnCompositeComparator" />
 709 		<Bug pattern="RV_NEGATING_RESULT_OF_COMPARETO" />
 710 	</Match>
 711 
 712 	<!-- Temporarily turning these one off, as it is used all over JMC as a performance 
 713 		enhancement. (One possible fix is to always return a copy of the array, 
 714 		wrap in an immutable collection or a copy of whatever object containing the 
 715 		state.) -->
 716 	<Match>
 717 		<Bug pattern="EI_EXPOSE_REP" />
 718 	</Match>
 719 	<Match>
 720 		<Bug pattern="EI_EXPOSE_REP2" />
 721 	</Match>
 722 	
 723 	<Match>
 724 		<Class
 725 			name="org.openjdk.jmc.flightrecorder.controlpanel.ui.configuration.model.xml.JFCGrammar" />
 726 		<Bug pattern="MS_PKGPROTECT" />
 727 	</Match>
 728 	<!-- JMC is not run with a SecurityManager -->
 729 	<Match>
 730 		<Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" />
 731 	</Match>
 732 
 733 	<!-- We we choose to ignore exceptions during shutdown, it is normally since 
 734 		we do not care, and do not wish to clutter the log. -->
 735 	<Match>
 736 		<Method name="dispose" />
 737 		<Bug pattern="DE_MIGHT_IGNORE" />
 738 	</Match>
 739 
 740 	<!-- The only downside with this is a redundant nullcheck, and we seem to 
 741 		only do this when API documentation tells us this may be necessary, or in 
 742 		conjunction with asserts (which seems to yield false positives) -->
 743 	<Match>
 744 		<Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
 745 	</Match>
 746 
 747 	<!-- If we need a comparator to be serializable, we make it serializable -->
 748 	<Match>
 749 		<Bug pattern="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" />
 750 	</Match>
 751 
 752 	<!-- It's a UI. It is quite common to switch on event types etc. and not 
 753 		have a default case. -->
 754 	<Match>
 755 		<Bug pattern="SF_SWITCH_NO_DEFAULT" />
 756 	</Match>
 757 
 758 	<!-- === Finbugs Rank 20 === -->
 759 	<!-- The standard Eclipse UI pattern is that critical components are built 
 760 		in the start method of plug-ins, and or createComposite method of UI classes. 
 761 		Since the method reported is not where the field is assigned, but rather 
 762 		referenced, we must disable this altogether (too common with false positives). -->
 763 	<Match>
 764 		<Bug pattern="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" />
 765 		<Rank value="20" />
 766 	</Match>
 767 	<Match>
 768 		<Class name="~.*Handler.*" />
 769 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 770 		<Rank value="20" />
 771 	</Match>
 772 	<!-- We know the component to be a tab folder -->
 773 	<Match>
 774 		<Class name="org.openjdk.jmc.components.ui.design.designelement.TabElement" />
 775 		<Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" />
 776 		<Rank value="20" />
 777 	</Match>
 778 
 779 	<!-- Null signals done/quit -->
 780 	<Match>
 781 		<Class name="org.openjdk.jmc.rcp.start.MCMain" />
 782 		<Method name="process" />
 783 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 784 		<Rank value="20" />
 785 	</Match>
 786 	<!-- Null signals could not get info -->
 787 	<Match>
 788 		<Class
 789 			name="org.openjdk.jmc.flightrecorder.controlpanel.ui.wizards.RecordingWizardModel" />
 790 		<Method name="getDescriptors" />
 791 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 792 		<Rank value="20" />
 793 	</Match>
 794 	<!-- Null signals parse error -->
 795 	<Match>
 796 		<Class name="org.openjdk.jmc.ui.misc.PersistableSashForm" />
 797 		<Method name="parseIntArray" />
 798 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 799 	</Match>
 800 
 801 	<!-- Not running with security manager -->
 802 	<Match>
 803 		<Bug pattern="DP_DO_INSIDE_DO_PRIVILEGED" />
 804 		<Rank value="20" />
 805 	</Match>
 806 	<!-- Don't care about performance in the test classes -->
 807 	<Match>
 808 		<Class name="~.*Tester.*" />
 809 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
 810 		<Rank value="20" />
 811 	</Match>
 812 
 813 	<!-- Type implied from isConnectioNNode method -->
 814 	<Match>
 815 		<Class name="org.openjdk.jmc.browser.views.BrowserLabelProvider" />
 816 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 817 		<Rank value="20" />
 818 	</Match>
 819 	<Match>
 820 		<Class name="org.openjdk.jmc.browser.views.JVMBrowserToolkit" />
 821 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 822 		<Rank value="20" />
 823 	</Match>
 824 	<Match>
 825 		<Class name="org.openjdk.jmc.browser.views.JVMBrowserNodeActionFilter" />
 826 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 827 		<Rank value="20" />
 828 	</Match>
 829 
 830 	<!-- This is an artefact from when we needed to be able to add pojo triggers 
 831 		for headless operation. NOTE: This will disappear after the rewrite. -->
 832 	<Match>
 833 		<Class name="org.openjdk.jmc.console.ui.notification.wizard.RuleWizard" />
 834 		<Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" />
 835 		<Rank value="20" />
 836 	</Match>
 837 
 838 	<!-- We always use styled text in this framework. -->
 839 	<Match>
 840 		<Class
 841 			name="org.openjdk.jmc.rcp.application.scripting.ControlContentAdapter" />
 842 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 843 		<Rank value="20" />
 844 	</Match>
 845 
 846 	<!-- Yes Java2D will always be available on modern JVMs. If we do not have 
 847 		access to AWT, we have much bigger problems... -->
 848 	<Match>
 849 		<Class
 850 			name="org.openjdk.jmc.flightrecorder.ui.components.graph.EventGraphTree" />
 851 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 852 		<Rank value="20" />
 853 	</Match>
 854 	<Match>
 855 		<Class name="org.openjdk.jmc.greychart.GreyChartPanel" />
 856 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 857 		<Rank value="20" />
 858 	</Match>
 859 	<Match>
 860 		<Class name="org.openjdk.jmc.greychart.JChartComponent" />
 861 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 862 		<Rank value="20" />
 863 	</Match>
 864 
 865 	<!-- isIntegrating implies type -->
 866 	<Match>
 867 		<Class name="~.*Buffer" />
 868 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 869 		<Rank value="20" />
 870 	</Match>
 871 
 872 	<!-- Safe in the framework -->
 873 	<Match>
 874 		<Class
 875 			name="~org\.openjdk\.jmc\.flightrecorder\.ui\.components\.aggregators\..*" />
 876 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 877 		<Rank value="20" />
 878 	</Match>
 879 
 880 	<!-- Only added to MBeanTreeSection parts. -->
 881 	<Match>
 882 		<Class name="org.openjdk.jmc.console.ui.mbeanbrowser.tree.MBeanTreeFilter" />
 883 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 884 		<Rank value="20" />
 885 	</Match>
 886 	<Match>
 887 		<Class
 888 			name="org.openjdk.jmc.console.ui.mbeanbrowser.tab.MBeanOperationsSectionPart" />
 889 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 890 		<Rank value="20" />
 891 	</Match>
 892 
 893 	<!-- Lost patience, excluding this bug pattern since there are so many false 
 894 		positives. I keep the other related excludes, since we may want to complete 
 895 		that work at a later point. -->
 896 	<Match>
 897 		<Bug pattern="BC_UNCONFIRMED_CAST" />
 898 		<Rank value="20" />
 899 	</Match>
 900 	<Match>
 901 		<Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" />
 902 		<Rank value="20" />
 903 	</Match>
 904 
 905 	<!-- Instance tracking -->
 906 	<Match>
 907 		<Class name="org.openjdk.jmc.browser.views.JVMBrowserViewDragSource" />
 908 		<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
 909 		<Rank value="20" />
 910 	</Match>
 911 
 912 	<!-- Will only provide values from a set of predefined values. -->
 913 	<Match>
 914 		<Class
 915 			name="org.openjdk.jmc.components.ui.design.view.layout.LayoutDataSliderListener" />
 916 		<Bug pattern="FE_FLOATING_POINT_EQUALITY" />
 917 		<Rank value="20" />
 918 	</Match>
 919 
 920 	<!-- Explicit nulls in the fields framework -->
 921 	<Match>
 922 		<Class name="~org\.openjdk\.jmc\.ui\.fields\..*" />
 923 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 924 		<Rank value="20" />
 925 	</Match>
 926 
 927 	<!-- In UI classes, this is really only causing the minor memory overhead 
 928 		of a this pointer. We can go after these later, but it will probably only 
 929 		clutter up the code. -->
 930 	<Match>
 931 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
 932 		<Rank value="20" />
 933 	</Match>
 934 
 935 	<!-- These are a lot of comparisons in JMC of double values where the values 
 936 		are not calculated values but previously read values. This is so common that 
 937 		I turn off this warning for now. -->
 938 	<Match>
 939 		<Bug pattern="FE_FLOATING_POINT_EQUALITY" />
 940 		<Rank value="20" />
 941 	</Match>
 942 
 943 	<!-- Excluding native memory since not yet shipped -->
 944 	<Match>
 945 		<Class name="~org\.openjdk\.jmc\.console\.ui\.nativememory\..*" />
 946 		<Rank value="20" />
 947 	</Match>
 948 
 949 	<!-- Modifications to this array are considered to be thread local.
 950 		 Only reference read/write are thread safe -->
 951 	<Match>
 952 	   <Class name="org.openjdk.jmc.browser.views.JVMBrowserView" />
 953 	   <Field name="expanded" />
 954 	   <Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" />
 955 	</Match>
 956 	
 957 	<!-- Null return value documented -->
 958 	<Match>
 959 		<Class name="org.openjdk.jmc.flightrecorder.internal.parser.binary.LoaderContext" />
 960 		<Method name="takeBuffer" />
 961 		<Bug pattern="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
 962 	</Match>
 963 
 964 	<!-- Calling method to force initialization -->
 965 	<Match>
 966 		<Class name="org.openjdk.jmc.rcp.application.Application" />
 967 		<Method name="start" />
 968 		<Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" />
 969 	</Match>
 970 	<Match>
 971 		<Class name="org.openjdk.jmc.ui.MCAbstractUIPlugin" />
 972 		<Method name="attemptToInitAWT" />
 973 		<Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" />
 974 	</Match>
 975 	<!-- Calling Class.forName to force class initialization -->
 976 	<Match>
 977 		<Class name="org.openjdk.jmc.attach.AttachToolkit" />
 978 		<Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" />
 979 	</Match>
 980 
 981 	<!-- Caching in volatile variable -->
 982 	<Match>
 983 		<Class name="org.openjdk.jmc.common.util.FilterMatcher" />
 984 		<Method name="regexpMatch" />
 985 		<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
 986 	</Match>
 987  
 988 	<!-- False positive, referenced by a lambda style method reference -->
 989 	<Match>
 990 		<Class name="~org\.openjdk\.jmc\.flightrecorder\.ui\.pages\.itemhandler\.AttributeMenuFactory.*" />
 991 		<Method name="attributeAggregatorMenu" />
 992 		<Bug pattern="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" />
 993 	</Match>
 994 	
 995 	<!-- Fall through is intentional -->
 996 	<Match>
 997 		<Class name="org.openjdk.jmc.flightrecorder.stacktrace.StacktraceFormatToolkit" />
 998 		<Method name="formatFrame" />
 999 		<Bug pattern="SF_SWITCH_FALLTHROUGH" />
1000 	</Match>
1001 	<Match>
1002 		<Class name="org.openjdk.jmc.flightrecorder.ui.JfrOutlinePage$OutlineDropListener" />
1003 		<Method name="performDrop" />
1004 		<Bug pattern="SF_SWITCH_FALLTHROUGH" />
1005 	</Match>
1006 	
1007 	<!-- We want to use single word "username" and "timestamp" but don't want to
1008 	    change the imported JConsole code that contains other camelCase variants. -->
1009 	<Match>
1010 		<Method name="getUsername" />
1011 		<Bug pattern="NM_CONFUSING" />
1012 	</Match>
1013 	<Match>
1014 		<Method name="getLastTimestamp" />
1015 		<Bug pattern="NM_CONFUSING" />
1016 	</Match>
1017 
1018 	<!-- We will not serialize Swing components -->
1019 	<Match>
1020 		<Class name="org.openjdk.jmc.console.jconsole.tabs.JConsolePluginTabbedPane" />
1021 		<Bug pattern="SE_BAD_FIELD" />
1022 	</Match>	
1023 	
1024 	<!-- False positive -->
1025 	<Match>
1026 		<Class name="org.openjdk.jmc.flightrecorder.internal.FlightRecordingLoader" />
1027 		<Method name="sendProgress" />
1028 		<Bug pattern="UC_USELESS_VOID_METHOD" />
1029 	</Match>	
1030 	
1031 	<!-- Fields are written using reflection and must match file format. -->
1032 	<Match>
1033 		<Class name="~org\.openjdk\.jmc\.flightrecorder\.internal\.parser\.v1\.StructTypes\$.*" />
1034 		<Bug pattern="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" />
1035 	</Match>
1036 	<Match>
1037 		<Class name="~org\.openjdk\.jmc\.flightrecorder\.internal\.parser\.v1\.StructTypes\$.*" />
1038 		<Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" />
1039 	</Match>
1040 
1041 	<!-- If we can find a better way of estimating free heap space then we should 
1042 		use that instead. -->
1043 	<Match>
1044 		<Class name="org.openjdk.jmc.flightrecorder.ui.RecordingLoader" />
1045 		<Method name="doCreateRecording" />
1046 		<Bug pattern="DM_GC" />
1047 	</Match>
1048 
1049 	<!-- These could theoretically be reworked into static inner classes but 
1050 		it is too much work and the performance impact is minimal. -->
1051 	<Match>
1052 		<Class name="org.openjdk.jmc.flightrecorder.ext.wls.WlsOverviewPage$WlsOverviewPageUi" />
1053 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" />
1054 	</Match>
1055 	<Match>
1056 		<Class name="org.openjdk.jmc.flightrecorder.ui.pages.DistinctItemsPage$DistinctItemsUi" />
1057 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" />
1058 	</Match>
1059 	<Match>
1060 		<Class name="org.openjdk.jmc.flightrecorder.ui.pages.TlabPage$TlabUI" />
1061 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" />
1062 	</Match>
1063 	<Match>
1064 		<Class name="org.openjdk.jmc.flightrecorder.stacktrace.StacktraceModel$Fork" />
1065 		<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" />
1066 	</Match>
1067 
1068 	<!-- False positive. CompletableFuture is completely happy with null and 
1069 		the value is ignored by consumers. Actually since this is a CompletableFuture<Void>, 
1070 		null is the only permitted value. -->
1071 	<Match>
1072 		<Class name="org.openjdk.jmc.flightrecorder.ui.JfrPropertySheet" />
1073 		<Method name="show" />
1074 		<Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
1075 	</Match>
1076 	
1077 	<!-- Skipping our embedded ASM -->
1078 	<Match>
1079         <Class name="~org\.openjdk\.jmc\.internal\.org\.objectweb\.asm\..*"/>
1080     </Match>
1081 
1082 	<!-- Field initialized indirectly through super constructor. It works but 
1083 		should still be changed to a safer initialization flow. -->
1084 	<Match>
1085 		<Class name="org.openjdk.jmc.flightrecorder.ui.pages.JavaApplicationPage$JavaApplicationUi"/>
1086 		<Field name="lanes"/>
1087 		<Bug pattern="UR_UNINIT_READ"/>
1088 	</Match>
1089 	<Match>
1090 		<Class name="org.openjdk.jmc.flightrecorder.ui.pages.ThreadsPage$ThreadsPageUi"/>
1091 		<Field name="lanes"/>
1092 		<Bug pattern="UR_UNINIT_READ"/>
1093 	</Match>
1094 	
1095 	<!-- Exclude the testserver package. It should really be fixed but is only used 
1096 		while testing so it is low priority. -->
1097 	<Match>
1098 		<Class name="~org\.openjdk\.jmc\.testserver\..*"/>
1099 	</Match>
1100 
1101 	<!-- Exclude various test classes. These are of low priority to fix. -->
1102 	<Match>
1103 		<Class name="org.openjdk.jmc.flightrecorder.ui.RecordingFileWriter"/>
1104 	</Match>
1105 	<Match>
1106 		<Class name="org.openjdk.jmc.greychart.testutil.RenderingOutOfOrderTester"/>
1107 	</Match>
1108 	<Match>
1109 		<Class name="org.openjdk.jmc.rjmx.testutil.RockitRunner"/>
1110 	</Match>
1111 	<Match>
1112 		<Class name="org.openjdk.jmc.rjmx.testutil.RockitRunner$WorkerThread"/>
1113 	</Match>
1114 	<Match>
1115 		<Class name="org.openjdk.jmc.rjmx.internal.RJMXConnectionTest"/>
1116 	</Match>
1117 	<Match>
1118 		<Class name="org.openjdk.jmc.rjmx.synthetic.CountingAttribute"/>
1119 	</Match>
1120 	<Match>
1121 		<Class name="org.openjdk.jmc.rjmx.RjmxTestCase"/>
1122 	</Match>
1123 	<Match>
1124 		<Class name="org.openjdk.jmc.rjmx.testutil.JVMKeepAlive"/>
1125 	</Match>
1126 	<Match>
1127 		<Class name="org.openjdk.jmc.rjmx.subscription.internal.EvilMethodsClass"/>
1128 	</Match>
1129 		
1130 </FindBugsFilter>