# Copyright 2013 Cloudera, Inc.
#
# Licensed 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.
#
# Blacklist of things not to run the sanitizer on.

# The safe math routines are expected to overflow, but anyone using them
# will check the resulting overflow flags.
fun:*kudu18safe_math_internal*

# Workaround for a bug in clang's libstdc++ which causes a false positive
# trying to use ostream << std::hex
# See http://llvm.org/bugs/show_bug.cgi?id=18156
fun:*_Ios_Fmtflags*

# Workaround for a problem with gmock where a runtime error is caused by a call on a null pointer,
# on a mocked object.
# Seen error:
# thirdparty/gmock-1.7.0/include/gmock/gmock-spec-builders.h:1529:12: runtime error: member call on null pointer of type 'testing::internal::ActionResultHolder<void>'
fun:*testing*internal*InvokeWith*
