Files
llvm-project/lldb/source/API/SBLanguageRuntime.cpp
Michael Buch 116b045b1e [lldb] Make argument to ConstString::AsCString explicit (#190183)
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
2026-04-07 13:39:48 +00:00

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;
}