Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[lldb/Target] Fix
frame recognizer list
crash when registered with …
…nullptr One way to register a recognizer is to use RegularExpressionSP for the module and symbol. In order to match a symbol regardless of the module, the recognizer can be registered with a nullptr for the module. However, this cause the frame recognizer list command to crash because it calls RegularExpression::GetText without checking if the shared pointer is valid. This patch adds checks for the symbol and module RegularExpressionSP. Differential Revision: https://reviews.llvm.org/D74212 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
- Loading branch information
1 parent
377d5d2
commit 212caa6
Showing
3 changed files
with
96 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
//===-- StackFrameRecognizerTest.cpp --------------------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "lldb/Target/StackFrameRecognizer.h" | ||
#include "Plugins/Platform/Linux/PlatformLinux.h" | ||
#include "lldb/Core/Debugger.h" | ||
#include "lldb/Host/FileSystem.h" | ||
#include "lldb/Host/HostInfo.h" | ||
#include "lldb/Utility/Reproducer.h" | ||
#include "lldb/lldb-enumerations.h" | ||
#include "lldb/lldb-forward.h" | ||
#include "lldb/lldb-private-enumerations.h" | ||
#include "lldb/lldb-private.h" | ||
#include "llvm/Support/FormatVariadic.h" | ||
#include "gtest/gtest.h" | ||
|
||
using namespace lldb_private; | ||
using namespace lldb_private::repro; | ||
using namespace lldb; | ||
|
||
namespace { | ||
class StackFrameRecognizerTest : public ::testing::Test { | ||
public: | ||
void SetUp() override { | ||
llvm::cantFail(Reproducer::Initialize(ReproducerMode::Off, llvm::None)); | ||
FileSystem::Initialize(); | ||
HostInfo::Initialize(); | ||
|
||
// Pretend Linux is the host platform. | ||
platform_linux::PlatformLinux::Initialize(); | ||
ArchSpec arch("powerpc64-pc-linux"); | ||
Platform::SetHostPlatform( | ||
platform_linux::PlatformLinux::CreateInstance(true, &arch)); | ||
} | ||
|
||
void TearDown() override { | ||
platform_linux::PlatformLinux::Terminate(); | ||
HostInfo::Terminate(); | ||
FileSystem::Terminate(); | ||
Reproducer::Terminate(); | ||
} | ||
}; | ||
|
||
class DummyStackFrameRecognizer : public StackFrameRecognizer { | ||
public: | ||
std::string GetName() override { return "Dummy StackFrame Recognizer"; } | ||
}; | ||
|
||
void RegisterDummyStackFrameRecognizer() { | ||
static llvm::once_flag g_once_flag; | ||
|
||
llvm::call_once(g_once_flag, []() { | ||
RegularExpressionSP module_regex_sp = nullptr; | ||
RegularExpressionSP symbol_regex_sp(new RegularExpression("boom")); | ||
|
||
StackFrameRecognizerSP dummy_recognizer_sp(new DummyStackFrameRecognizer()); | ||
|
||
StackFrameRecognizerManager::AddRecognizer( | ||
dummy_recognizer_sp, module_regex_sp, symbol_regex_sp, false); | ||
}); | ||
} | ||
|
||
} // namespace | ||
|
||
TEST_F(StackFrameRecognizerTest, NullModuleRegex) { | ||
DebuggerSP debugger_sp = Debugger::CreateInstance(); | ||
ASSERT_TRUE(debugger_sp); | ||
|
||
RegisterDummyStackFrameRecognizer(); | ||
|
||
bool any_printed = false; | ||
StackFrameRecognizerManager::ForEach( | ||
[&any_printed](uint32_t recognizer_id, std::string name, | ||
std::string function, std::string symbol, | ||
bool regexp) { any_printed = true; }); | ||
|
||
EXPECT_TRUE(any_printed); | ||
} |