This patch makes the default parameter to ConstString::AsCString
explicit. Currently it defaults to `nullptr`. However, there a bunch of
callsites that do `printf("%s", foo.AsCString())`, which is UB (I have
at least 1 crash on me where this was the root cause).
Alternatively we could change the default to `""` instead of `nullptr`,
but code that did `if (foo.AsCString())` would then change meaning.
Command I ran to generate this patch:
```
rg "\.AsCString\(\)" lldb -l | xargs sed -i '' 's/\.AsCString()/.AsCString(nullptr)/g'
```
There's also a commonly used `Status::AsCString` with a default
parameter. So I added a temporary:
```
const char *AsCString(std::nullptr_t) const = delete;
```
overload to `Status`, and fixed all the compile errors.
In a follow-up PR I intend to change the callsites that do `printf("%s",
foo.AsCString(nullptr)` to pass `""` as the fallback parameter. Another
dangrous pattern is `std::string(error.AsCString(nullptr))`
rdar://171219173
69 lines
2.2 KiB
C++
69 lines
2.2 KiB
C++
//===-- SBLanguageRuntime.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/API/SBLanguageRuntime.h"
|
|
#include "lldb/Target/Language.h"
|
|
#include "lldb/Utility/Instrumentation.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
lldb::LanguageType
|
|
SBLanguageRuntime::GetLanguageTypeFromString(const char *string) {
|
|
LLDB_INSTRUMENT_VA(string);
|
|
|
|
return Language::GetLanguageTypeFromString(llvm::StringRef(string));
|
|
}
|
|
|
|
const char *
|
|
SBLanguageRuntime::GetNameForLanguageType(lldb::LanguageType language) {
|
|
LLDB_INSTRUMENT_VA(language);
|
|
|
|
return Language::GetNameForLanguageType(language);
|
|
}
|
|
|
|
bool SBLanguageRuntime::LanguageIsCPlusPlus(lldb::LanguageType language) {
|
|
return Language::LanguageIsCPlusPlus(language);
|
|
}
|
|
|
|
bool SBLanguageRuntime::LanguageIsObjC(lldb::LanguageType language) {
|
|
return Language::LanguageIsObjC(language);
|
|
}
|
|
|
|
bool SBLanguageRuntime::LanguageIsCFamily(lldb::LanguageType language) {
|
|
return Language::LanguageIsCFamily(language);
|
|
}
|
|
|
|
bool SBLanguageRuntime::SupportsExceptionBreakpointsOnThrow(
|
|
lldb::LanguageType language) {
|
|
if (Language *lang_plugin = Language::FindPlugin(language))
|
|
return lang_plugin->SupportsExceptionBreakpointsOnThrow();
|
|
return false;
|
|
}
|
|
|
|
bool SBLanguageRuntime::SupportsExceptionBreakpointsOnCatch(
|
|
lldb::LanguageType language) {
|
|
if (Language *lang_plugin = Language::FindPlugin(language))
|
|
return lang_plugin->SupportsExceptionBreakpointsOnCatch();
|
|
return false;
|
|
}
|
|
|
|
const char *
|
|
SBLanguageRuntime::GetThrowKeywordForLanguage(lldb::LanguageType language) {
|
|
if (Language *lang_plugin = Language::FindPlugin(language))
|
|
return ConstString(lang_plugin->GetThrowKeyword()).AsCString(nullptr);
|
|
return nullptr;
|
|
}
|
|
|
|
const char *
|
|
SBLanguageRuntime::GetCatchKeywordForLanguage(lldb::LanguageType language) {
|
|
if (Language *lang_plugin = Language::FindPlugin(language))
|
|
return ConstString(lang_plugin->GetCatchKeyword()).AsCString(nullptr);
|
|
return nullptr;
|
|
}
|