<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<!--
  This file contains some false positive bugs detected by findbugs. Their
  false positive nature has been analyzed individually and they have been
  put here to instruct findbugs it must ignore them.
-->
<FindBugsFilter>

<!-- N.B. Using wild-card class names so exclusions work regardless of the top-level package -->

  <!-- Waiting on BCEL-252 -->
  <Match>
    <Class name="~.*\.util\.Class2HTML" />
    <Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" />
  </Match>

  <!-- Class is not supposed to be an Exception itself -->
  <Match>
    <Class name="~.*\.classfile\.CodeException" />
    <Bug pattern="NM_CLASS_NOT_EXCEPTION" />
  </Match>
  
  <!-- Ignore GC here -->
  <Match>
    <Class name="~.*\.verifier\.TransitiveHull" />
    <Bug pattern="DM_GC" />
  </Match>

  <!-- clone() creates a new instance so does not need to call super.clone() -->
  <Match>
    <Bug pattern="CN_IDIOM_NO_SUPER_CALL"/>
    <Method name="clone"/>
    <Or>
      <Class name="~.*\.verifier\.structurals\.LocalVariables"/>
      <Class name="~.*\.verifier\.structurals\.OperandStack"/>
    </Or>
  </Match>

  <!-- Reason: TODO, perhaps? -->
  <Match>
    <Class name="~.*" />
    <Or>
      <Bug pattern="EI_EXPOSE_REP" />
      <Bug pattern="EI_EXPOSE_REP2" />
    </Or>
  </Match>

  <!-- TODO - enable later -->
  <Match>
    <Class name="~.*" />
    <Bug pattern="MS_MUTABLE_ARRAY" />
  </Match>

  <!-- Test data classes -->
  <Match>
    <Or>
      <Class name="~.*\.data\..*" />
      <Class name="~.*\.tests\.Test.*" />
    </Or>
  </Match>

</FindBugsFilter>
