Bug Summary

File:jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp
Warning:line 154, column 24
The left operand of '==' is a garbage value due to array index out of bounds

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test_gcTraceTime.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/libjvm/gtest/objs/precompiled -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D _GNU_SOURCE -D _REENTRANT -D LIBC=gnu -D LINUX -D VM_LITTLE_ENDIAN -D _LP64=1 -D ASSERT -D CHECK_UNHANDLED_OOPS -D TARGET_ARCH_x86 -D INCLUDE_SUFFIX_OS=_linux -D INCLUDE_SUFFIX_CPU=_x86 -D INCLUDE_SUFFIX_COMPILER=_gcc -D TARGET_COMPILER_gcc -D AMD64 -D HOTSPOT_LIB_ARCH="amd64" -D COMPILER1 -D COMPILER2 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -I /home/daniel/Projects/java/jdk/src/hotspot/share/precompiled -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjimage -I /home/daniel/Projects/java/googletest/googletest/include -I /home/daniel/Projects/java/googletest/googlemock/include -I /home/daniel/Projects/java/jdk/test/hotspot/gtest -I /home/daniel/Projects/java/jdk/test/hotspot/gtest -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-format-zero-length -Wno-unused-parameter -Wno-unused -Wno-parentheses -Wno-comment -Wno-unknown-pragmas -Wno-address -Wno-delete-non-virtual-dtor -Wno-char-subscripts -Wno-array-bounds -Wno-int-in-bool-context -Wno-ignored-qualifiers -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-empty-body -Wno-strict-overflow -Wno-sequence-point -Wno-maybe-uninitialized -Wno-misleading-indentation -Wno-cast-function-type -Wno-shift-negative-value -Wno-undef -Wno-stringop-overflow -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make/hotspot -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c++ /home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp

/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp

1/*
2 * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24#include "precompiled.hpp"
25#include "jvm.h"
26#include "gc/shared/gcTraceTime.inline.hpp"
27#include "logTestFixture.hpp"
28#include "logTestUtils.inline.hpp"
29#include "logging/log.hpp"
30#include "runtime/interfaceSupport.inline.hpp"
31#include "unittest.hpp"
32
33class GCTraceTimeTest : public LogTestFixture {
34};
35
36TEST_VM_F(GCTraceTimeTest, full)class GCTraceTimeTest_full_vm_Test : public GCTraceTimeTest {
public: GCTraceTimeTest_full_vm_Test() {} private: virtual void
TestBody(); static ::testing::TestInfo* const test_info_ __attribute__
((unused)); GCTraceTimeTest_full_vm_Test(GCTraceTimeTest_full_vm_Test
const &) = delete; void operator=(GCTraceTimeTest_full_vm_Test
const &) = delete;};::testing::TestInfo* const GCTraceTimeTest_full_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"GCTraceTimeTest", "full_vm", __null, __null, ::testing::internal
::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 36), (::testing::internal::GetTypeId<GCTraceTimeTest>
()), GCTraceTimeTest::SetUpTestCase, GCTraceTimeTest::TearDownTestCase
, new ::testing::internal::TestFactoryImpl< GCTraceTimeTest_full_vm_Test
>);void GCTraceTimeTest_full_vm_Test::TestBody()
{
37 set_log_config(TestLogFileName, "gc=debug,gc+start=debug");
38
39 LogTarget(Debug, gc)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_debug;
40 LogTarget(Debug, gc, start)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_start
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_start_debug;
41
42 EXPECT_TRUE(gc_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_debug.is_enabled()
)) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 42, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_debug.is_enabled()", "false", "true").c_str()) = ::testing
::Message()
;
43 EXPECT_TRUE(gc_start_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_start_debug.is_enabled
())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 43, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_start_debug.is_enabled()", "false", "true").c_str()) = ::
testing::Message()
;
44
45 {
46 ThreadInVMfromNative tvn(JavaThread::current());
47 MutexLocker lock(Heap_lock); // Needed to read heap usage
48 GCTraceTime(Debug, gc)GCTraceTimeWrapper<LogLevel::Debug, (LogTag::_gc), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG), (LogTag::__NO_TAG)>
timer("Test GC", NULL__null, GCCause::_allocation_failure, true);
49 }
50
51 const char* expected[] = {
52 "[gc,start", "] Test GC (Allocation Failure)",
53 "[gc", "] Test GC (Allocation Failure) ", "M) ", "ms",
54 NULL__null
55 };
56 EXPECT_TRUE(file_contains_substrings_in_order(TestLogFileName, expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(file_contains_substrings_in_order
(TestLogFileName, expected))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 56, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, expected)"
, "false", "true").c_str()) = ::testing::Message()
;
57}
58
59TEST_VM_F(GCTraceTimeTest, full_multitag)class GCTraceTimeTest_full_multitag_vm_Test : public GCTraceTimeTest
{ public: GCTraceTimeTest_full_multitag_vm_Test() {} private
: virtual void TestBody(); static ::testing::TestInfo* const test_info_
__attribute__ ((unused)); GCTraceTimeTest_full_multitag_vm_Test
(GCTraceTimeTest_full_multitag_vm_Test const &) = delete;
void operator=(GCTraceTimeTest_full_multitag_vm_Test const &
) = delete;};::testing::TestInfo* const GCTraceTimeTest_full_multitag_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"GCTraceTimeTest", "full_multitag_vm", __null, __null, ::testing
::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 59), (::testing::internal::GetTypeId<GCTraceTimeTest>
()), GCTraceTimeTest::SetUpTestCase, GCTraceTimeTest::TearDownTestCase
, new ::testing::internal::TestFactoryImpl< GCTraceTimeTest_full_multitag_vm_Test
>);void GCTraceTimeTest_full_multitag_vm_Test::TestBody()
{
60 set_log_config(TestLogFileName, "gc+ref=debug,gc+ref+start=debug");
61
62 LogTarget(Debug, gc, ref)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_ref
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_debug;
63 LogTarget(Debug, gc, ref, start)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_ref
), (LogTag::_start), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (
LogTag::__NO_TAG)>
gc_start_debug;
64
65 EXPECT_TRUE(gc_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_debug.is_enabled()
)) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 65, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_debug.is_enabled()", "false", "true").c_str()) = ::testing
::Message()
;
66 EXPECT_TRUE(gc_start_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_start_debug.is_enabled
())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 66, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_start_debug.is_enabled()", "false", "true").c_str()) = ::
testing::Message()
;
67
68 {
69 ThreadInVMfromNative tvn(JavaThread::current());
70 MutexLocker lock(Heap_lock); // Needed to read heap usage
71 GCTraceTime(Debug, gc, ref)GCTraceTimeWrapper<LogLevel::Debug, (LogTag::_gc), (LogTag
::_ref), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG
), (LogTag::__NO_TAG)>
timer("Test GC", NULL__null, GCCause::_allocation_failure, true);
72 }
73
74 const char* expected[] = {
75 "[gc,ref,start", "] Test GC (Allocation Failure)",
76 "[gc,ref", "] Test GC (Allocation Failure) ", "M) ", "ms",
77 NULL__null
78 };
79 EXPECT_TRUE(file_contains_substrings_in_order(TestLogFileName, expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(file_contains_substrings_in_order
(TestLogFileName, expected))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 79, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, expected)"
, "false", "true").c_str()) = ::testing::Message()
;
80}
81
82TEST_VM_F(GCTraceTimeTest, no_heap)class GCTraceTimeTest_no_heap_vm_Test : public GCTraceTimeTest
{ public: GCTraceTimeTest_no_heap_vm_Test() {} private: virtual
void TestBody(); static ::testing::TestInfo* const test_info_
__attribute__ ((unused)); GCTraceTimeTest_no_heap_vm_Test(GCTraceTimeTest_no_heap_vm_Test
const &) = delete; void operator=(GCTraceTimeTest_no_heap_vm_Test
const &) = delete;};::testing::TestInfo* const GCTraceTimeTest_no_heap_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"GCTraceTimeTest", "no_heap_vm", __null, __null, ::testing::
internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 82), (::testing::internal::GetTypeId<GCTraceTimeTest>
()), GCTraceTimeTest::SetUpTestCase, GCTraceTimeTest::TearDownTestCase
, new ::testing::internal::TestFactoryImpl< GCTraceTimeTest_no_heap_vm_Test
>);void GCTraceTimeTest_no_heap_vm_Test::TestBody()
{
83 set_log_config(TestLogFileName, "gc=debug,gc+start=debug");
84
85 LogTarget(Debug, gc)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_debug;
86 LogTarget(Debug, gc, start)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_start
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_start_debug;
87
88 EXPECT_TRUE(gc_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_debug.is_enabled()
)) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 88, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_debug.is_enabled()", "false", "true").c_str()) = ::testing
::Message()
;
89 EXPECT_TRUE(gc_start_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_start_debug.is_enabled
())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 89, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_start_debug.is_enabled()", "false", "true").c_str()) = ::
testing::Message()
;
90
91 {
92 GCTraceTime(Debug, gc)GCTraceTimeWrapper<LogLevel::Debug, (LogTag::_gc), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG), (LogTag::__NO_TAG)>
timer("Test GC", NULL__null, GCCause::_allocation_failure, false);
93 }
94
95 const char* expected[] = {
96 // [2.975s][debug][gc,start] Test GC (Allocation Failure)
97 "[gc,start", "] Test GC (Allocation Failure)",
98 // [2.975s][debug][gc ] Test GC (Allocation Failure) 0.026ms
99 "[gc", "] Test GC (Allocation Failure) ", "ms",
100 NULL__null
101 };
102 EXPECT_TRUE(file_contains_substrings_in_order(TestLogFileName, expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(file_contains_substrings_in_order
(TestLogFileName, expected))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 102, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, expected)"
, "false", "true").c_str()) = ::testing::Message()
;
103
104 const char* not_expected[] = {
105 // [2.975s][debug][gc ] Test GC 59M->59M(502M) 0.026ms
106 "[gc", "] Test GC ", "M) ", "ms",
107 };
108 EXPECT_FALSE(file_contains_substrings_in_order(TestLogFileName, not_expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(!(file_contains_substrings_in_order
(TestLogFileName, not_expected)))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 108, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, not_expected)"
, "true", "false").c_str()) = ::testing::Message()
;
109}
110
111TEST_VM_F(GCTraceTimeTest, no_cause)class GCTraceTimeTest_no_cause_vm_Test : public GCTraceTimeTest
{ public: GCTraceTimeTest_no_cause_vm_Test() {} private: virtual
void TestBody(); static ::testing::TestInfo* const test_info_
__attribute__ ((unused)); GCTraceTimeTest_no_cause_vm_Test(GCTraceTimeTest_no_cause_vm_Test
const &) = delete; void operator=(GCTraceTimeTest_no_cause_vm_Test
const &) = delete;};::testing::TestInfo* const GCTraceTimeTest_no_cause_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"GCTraceTimeTest", "no_cause_vm", __null, __null, ::testing::
internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 111), (::testing::internal::GetTypeId<GCTraceTimeTest>
()), GCTraceTimeTest::SetUpTestCase, GCTraceTimeTest::TearDownTestCase
, new ::testing::internal::TestFactoryImpl< GCTraceTimeTest_no_cause_vm_Test
>);void GCTraceTimeTest_no_cause_vm_Test::TestBody()
{
112 set_log_config(TestLogFileName, "gc=debug,gc+start=debug");
113
114 LogTarget(Debug, gc)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_debug;
115 LogTarget(Debug, gc, start)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_start
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_start_debug;
116
117 EXPECT_TRUE(gc_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_debug.is_enabled()
)) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 117, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_debug.is_enabled()", "false", "true").c_str()) = ::testing
::Message()
;
118 EXPECT_TRUE(gc_start_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_start_debug.is_enabled
())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 118, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_start_debug.is_enabled()", "false", "true").c_str()) = ::
testing::Message()
;
119
120 {
121 ThreadInVMfromNative tvn(JavaThread::current());
122 MutexLocker lock(Heap_lock); // Needed to read heap usage
123 GCTraceTime(Debug, gc)GCTraceTimeWrapper<LogLevel::Debug, (LogTag::_gc), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG), (LogTag::__NO_TAG)>
timer("Test GC", NULL__null, GCCause::_no_gc, true);
124 }
125
126 const char* expected[] = {
127 // [2.975s][debug][gc,start] Test GC
128 "[gc,start", "] Test GC",
129 // [2.975s][debug][gc ] Test GC 59M->59M(502M) 0.026ms
130 "[gc", "] Test GC ", "M) ", "ms",
131 NULL__null
132 };
133 EXPECT_TRUE(file_contains_substrings_in_order(TestLogFileName, expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(file_contains_substrings_in_order
(TestLogFileName, expected))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 133, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, expected)"
, "false", "true").c_str()) = ::testing::Message()
;
134}
135
136TEST_VM_F(GCTraceTimeTest, no_heap_no_cause)class GCTraceTimeTest_no_heap_no_cause_vm_Test : public GCTraceTimeTest
{ public: GCTraceTimeTest_no_heap_no_cause_vm_Test() {} private
: virtual void TestBody(); static ::testing::TestInfo* const test_info_
__attribute__ ((unused)); GCTraceTimeTest_no_heap_no_cause_vm_Test
(GCTraceTimeTest_no_heap_no_cause_vm_Test const &) = delete
; void operator=(GCTraceTimeTest_no_heap_no_cause_vm_Test const
&) = delete;};::testing::TestInfo* const GCTraceTimeTest_no_heap_no_cause_vm_Test
::test_info_ = ::testing::internal::MakeAndRegisterTestInfo(
"GCTraceTimeTest", "no_heap_no_cause_vm", __null, __null, ::
testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 136), (::testing::internal::GetTypeId<GCTraceTimeTest>
()), GCTraceTimeTest::SetUpTestCase, GCTraceTimeTest::TearDownTestCase
, new ::testing::internal::TestFactoryImpl< GCTraceTimeTest_no_heap_no_cause_vm_Test
>);void GCTraceTimeTest_no_heap_no_cause_vm_Test::TestBody
()
{
137 set_log_config(TestLogFileName, "gc=debug,gc+start=debug");
138
139 LogTarget(Debug, gc)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_debug;
140 LogTarget(Debug, gc, start)LogTargetImpl<LogLevel::Debug, (LogTag::_gc), (LogTag::_start
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>
gc_start_debug;
141
142 EXPECT_TRUE(gc_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_debug.is_enabled()
)) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 142, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_debug.is_enabled()", "false", "true").c_str()) = ::testing
::Message()
;
1
Control jumps to 'case 0:' at line 142
2
Assuming the condition is false
3
Taking false branch
143 EXPECT_TRUE(gc_start_debug.is_enabled())switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(gc_start_debug.is_enabled
())) ; else ::testing::internal::AssertHelper(::testing::TestPartResult
::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 143, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "gc_start_debug.is_enabled()", "false", "true").c_str()) = ::
testing::Message()
;
4
Control jumps to 'case 0:' at line 143
5
Assuming the condition is true
6
Taking true branch
144
145 {
146 GCTraceTime(Debug, gc)GCTraceTimeWrapper<LogLevel::Debug, (LogTag::_gc), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG), (LogTag::__NO_TAG)>
timer("Test GC", NULL__null, GCCause::_no_gc, false);
147 }
148
149 const char* expected[] = {
150 // [2.975s][debug][gc,start] Test GC
151 "[gc,start", "] Test GC",
152 // [2.975s][debug][gc ] Test GC 0.026ms
153 "[gc", "] Test GC ", "ms",
154 NULL__null
155 };
156 EXPECT_TRUE(file_contains_substrings_in_order(TestLogFileName, expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(file_contains_substrings_in_order
(TestLogFileName, expected))) ; else ::testing::internal::AssertHelper
(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 156, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, expected)"
, "false", "true").c_str()) = ::testing::Message()
;
7
Control jumps to 'case 0:' at line 156
8
Taking false branch
157
158 const char* not_expected[] = {
159 // [2.975s][debug][gc ] Test GC 59M->59M(502M) 0.026ms
160 "[gc", "] Test GC ", "M) ", "ms",
161 };
162 EXPECT_FALSE(file_contains_substrings_in_order(TestLogFileName, not_expected))switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(!(file_contains_substrings_in_order
(TestLogFileName, not_expected)))) ; else ::testing::internal
::AssertHelper(::testing::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/test_gcTraceTime.cpp"
, 162, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "file_contains_substrings_in_order(TestLogFileName, not_expected)"
, "true", "false").c_str()) = ::testing::Message()
;
9
Control jumps to 'case 0:' at line 162
10
Calling 'file_contains_substrings_in_order'
163}

/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp

1/*
2 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24#include "logging/log.hpp"
25#include "logging/logAsyncWriter.hpp"
26#include "logging/logConfiguration.hpp"
27#include "logging/logStream.hpp"
28#include "memory/resourceArea.hpp"
29#include "runtime/os.hpp"
30#include "unittest.hpp"
31
32#define LOG_TEST_STRING_LITERAL"a (hopefully) unique log message for testing" "a (hopefully) unique log message for testing"
33
34static const char* invalid_selection_substr[] = {
35 "=", "+", " ", "+=", "+=*", "*+", " +", "**", "++", ".", ",", ",,", ",+",
36 " *", "all+", "all*", "+all", "+all=Warning", "==Info", "=InfoWarning",
37 "BadTag+", "logging++", "logging*+", ",=", "gc+gc+"
38};
39
40static inline bool string_contains_substring(const char* haystack, const char* needle) {
41 return strstr(haystack, needle) != NULL__null;
42}
43
44static inline bool file_exists(const char* filename) {
45 struct stat st;
46 return os::stat(filename, &st) == 0;
47}
48
49static inline void delete_file(const char* filename) {
50 AsyncLogWriter::flush();
51 if (!file_exists(filename)) {
52 return;
53 }
54 int ret = remove(filename);
55 EXPECT_TRUE(ret == 0 || errno == ENOENT)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(ret == 0 || (*__errno_location
()) == 2)) ; else ::testing::internal::AssertHelper(::testing
::TestPartResult::kNonFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 55, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "ret == 0 || errno == ENOENT", "false", "true").c_str()) = ::
testing::Message()
<< "failed to remove file '" << filename << "': "
56 << os::strerror(errno(*__errno_location ())) << " (" << errno(*__errno_location ()) << ")";
57}
58
59static inline void create_directory(const char* name) {
60 assert(!file_exists(name), "can't create directory: %s already exists", name)do { if (!(!file_exists(name))) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 60, "assert(" "!file_exists(name)" ") failed", "can't create directory: %s already exists"
, name); ::breakpoint(); } } while (0)
;
61 bool failed;
62#ifdef _WINDOWS
63 failed = !CreateDirectory(name, NULL__null);
64#else
65 failed = mkdir(name, 0777);
66#endif
67 assert(!failed, "failed to create directory %s", name)do { if (!(!failed)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 67, "assert(" "!failed" ") failed", "failed to create directory %s"
, name); ::breakpoint(); } } while (0)
;
68}
69
70static inline void delete_empty_directory(const char* name) {
71#ifdef _WINDOWS
72 if (!file_exists(name)) {
73 return;
74 }
75 bool failed;
76 failed = !RemoveDirectory(name);
77 EXPECT_FALSE(failed)switch (0) case 0: default: if (const ::testing::AssertionResult
gtest_ar_ = ::testing::AssertionResult(!(failed))) ; else ::
testing::internal::AssertHelper(::testing::TestPartResult::kNonFatalFailure
, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 77, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_
, "failed", "true", "false").c_str()) = ::testing::Message()
<< "failed to remove directory '" << name
78 << "': LastError = " << GetLastError();
79#else
80 delete_file(name);
81#endif
82}
83
84static inline void init_log_file(const char* filename, const char* options = "") {
85 LogStreamHandle(Error, logging)LogStreamTemplate<LogLevel::Error, (LogTag::_logging), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG), (LogTag::__NO_TAG)>
stream;
86 bool success = LogConfiguration::parse_log_arguments(filename, "logging=trace", "", options, &stream);
87 guarantee(success, "Failed to initialize log file '%s' with options '%s'", filename, options)do { if (!(success)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 87, "guarantee(" "success" ") failed", "Failed to initialize log file '%s' with options '%s'"
, filename, options); ::breakpoint(); } } while (0)
;
88 log_debug(logging)(!(LogImpl<(LogTag::_logging), (LogTag::__NO_TAG), (LogTag
::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::
__NO_TAG)>::is_level(LogLevel::Debug))) ? (void)0 : LogImpl
<(LogTag::_logging), (LogTag::__NO_TAG), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
>::write<LogLevel::Debug>
("%s", LOG_TEST_STRING_LITERAL"a (hopefully) unique log message for testing");
89 success = LogConfiguration::parse_log_arguments(filename, "all=off", "", "", &stream);
90 guarantee(success, "Failed to disable logging to file '%s'", filename)do { if (!(success)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 90, "guarantee(" "success" ") failed", "Failed to disable logging to file '%s'"
, filename); ::breakpoint(); } } while (0)
;
91}
92
93static const char* tmp_dir = os::get_temp_directory();
94static const char* file_sep = os::file_separator();
95
96// Prepend filename with the temp directory and pid and return the result as a
97// resource allocated string.
98static inline char* prepend_temp_dir(const char* filename) {
99 size_t temp_file_len = strlen(tmp_dir) + strlen(file_sep) + strlen(filename) + 28;
100 char* temp_file = NEW_RESOURCE_ARRAY(char, temp_file_len)(char*) resource_allocate_bytes((temp_file_len) * sizeof(char
))
;
101 int ret = jio_snprintf(temp_file, temp_file_len, "%s%spid%d.%s",
102 tmp_dir, file_sep,
103 os::current_process_id(), filename);
104 return temp_file;
105}
106
107// Prepend filename with specified prefix and the temp directory and return the
108// result as a malloc allocated string. This is used by test_logFileOutput.cpp.
109static inline char* prepend_prefix_temp_dir(const char* prefix, const char* filename) {
110 size_t temp_file_len = strlen(prefix) + strlen(tmp_dir) + strlen(file_sep) + strlen(filename) + 1;
111 char* temp_file = (char*)os::malloc(temp_file_len, mtLogging);
112 int ret = jio_snprintf(temp_file, temp_file_len, "%s%s%s%s",
113 prefix, tmp_dir, file_sep, filename);
114 return temp_file;
115}
116
117// Read a complete line from fp and return it as a resource allocated string.
118// Returns NULL on EOF.
119static inline char* read_line(FILE* fp) {
120 assert(fp != NULL, "invalid fp")do { if (!(fp != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 120, "assert(" "fp != __null" ") failed", "invalid fp"); ::
breakpoint(); } } while (0)
;
121 int buflen = 512;
122 char* buf = NEW_RESOURCE_ARRAY(char, buflen)(char*) resource_allocate_bytes((buflen) * sizeof(char));
123 long pos = ftell(fp);
124 if (pos < 0) return NULL__null;
125
126 char* ret = fgets(buf, buflen, fp);
127 while (ret != NULL__null && buf[strlen(buf) - 1] != '\n' && !feof(fp)) {
128 // retry with a larger buffer
129 buf = REALLOC_RESOURCE_ARRAY(char, buf, buflen, buflen * 2)(char*) resource_reallocate_bytes((char*)(buf), (buflen) * sizeof
(char), (buflen * 2) * sizeof(char))
;
130 buflen *= 2;
131 // rewind to beginning of line
132 fseek(fp, pos, SEEK_SET0);
133 // retry read with new buffer
134 ret = fgets(buf, buflen, fp);
135 }
136 return ret;
137}
138
139static bool file_contains_substrings_in_order(const char* filename, const char* substrs[]) {
140 AsyncLogWriter::flush();
141 FILE* fp = fopen(filename, "r");
142 assert(fp != NULL, "error opening file %s: %s", filename, strerror(errno))do { if (!(fp != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp"
, 142, "assert(" "fp != __null" ") failed", "error opening file %s: %s"
, filename, strerror((*__errno_location ()))); ::breakpoint()
; } } while (0)
;
11
Assuming the condition is true
12
Taking false branch
13
Loop condition is false. Exiting loop
143
144 size_t idx = 0;
145 while (substrs[idx] != NULL__null) {
14
Loop condition is true. Entering loop body
146 ResourceMark rm;
147 char* line = read_line(fp);
148 if (line
14.1
'line' is not equal to NULL
14.1
'line' is not equal to NULL
== NULL__null) {
15
Taking false branch
149 break;
150 }
151 for (char* match = strstr(line, substrs[idx]); match != NULL__null;) {
16
Assuming 'match' is not equal to NULL
17
Loop condition is true. Entering loop body
19
Assuming 'match' is not equal to NULL
20
Loop condition is true. Entering loop body
22
Assuming 'match' is not equal to NULL
23
Loop condition is true. Entering loop body
25
Assuming 'match' is not equal to NULL
26
Loop condition is true. Entering loop body
152 size_t match_len = strlen(substrs[idx]);
153 idx++;
27
The value 4 is assigned to 'idx'
154 if (substrs[idx] == NULL__null) {
18
Taking false branch
21
Taking false branch
24
Taking false branch
28
The left operand of '==' is a garbage value due to array index out of bounds
155 break;
156 }
157 match = strstr(match + match_len, substrs[idx]);
158 }
159 }
160
161 fclose(fp);
162 return substrs[idx] == NULL__null;
163}
164
165static inline bool file_contains_substring(const char* filename, const char* substr) {
166 const char* strs[] = {substr, NULL__null};
167 return file_contains_substrings_in_order(filename, strs);
168}