Commit 17329d17ef2f640c5f03e36351f1e19f43acf108 lint: Add exclusions for libmultiprocess subtree looks suboptimal because it adds exceptions for the entire src/ipc/libmultiprocess/ subtree for a whole class of issues. Because there are a few specific issues currently. Even if they are ok, it means new issues will sneak in src/ipc/libmultiprocess/ unnoticed.
It would be better to either resolve the issues and not exclude src/ipc/libmultiprocess/ from linters or add exceptions for the particular issues mentioned in the commit message, so that newly added issues in the future will be detected.
Here is a patch to resolve the locale-dependent issues:
<details>
<summary>[patch] resolve local-dependent issues</summary>
diff --git i/src/ipc/libmultiprocess/example/calculator.cpp w/src/ipc/libmultiprocess/example/calculator.cpp
index 4290d68733..6926fb8b57 100644
--- i/src/ipc/libmultiprocess/example/calculator.cpp
+++ w/src/ipc/libmultiprocess/example/calculator.cpp
@@ -1,11 +1,12 @@
// Copyright (c) 2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <calculator.h>
+#include <charconv>
#include <fstream>
#include <init.capnp.h>
#include <init.capnp.proxy.h> // NOLINT(misc-include-cleaner)
#include <init.h>
#include <iostream>
#include <memory>
@@ -41,13 +42,17 @@ static void LogPrint(bool raise, const std::string& message)
int main(int argc, char** argv)
{
if (argc != 2) {
std::cout << "Usage: mpcalculator <fd>\n";
return 1;
}
+ int fd;
+ if (std::from_chars(argv[1], argv[1] + strlen(argv[1]), fd).ec != std::errc{}) {
+ std::cout << argv[1] << " is not a number or is larger than an int\n";
+ return 1;
+ }
mp::EventLoop loop("mpcalculator", LogPrint);
- const int fd = std::stoi(argv[1]);
std::unique_ptr<Init> init = std::make_unique<InitImpl>();
mp::ServeStream<InitInterface>(loop, fd, *init);
loop.loop();
return 0;
}
diff --git i/src/ipc/libmultiprocess/example/example.cpp w/src/ipc/libmultiprocess/example/example.cpp
index a4f84c55a7..d0e9458f5c 100644
--- i/src/ipc/libmultiprocess/example/example.cpp
+++ w/src/ipc/libmultiprocess/example/example.cpp
@@ -22,13 +22,13 @@ static auto Spawn(mp::EventLoop& loop, const std::string& process_argv0, const s
{
int pid;
const int fd = mp::SpawnProcess(pid, [&](int fd) -> std::vector<std::string> {
fs::path path = process_argv0;
path.remove_filename();
path.append(new_exe_name);
- return {path.string(), std::to_string(fd)};
+ return {path.string(), std::format("{:d}", fd)};
});
return std::make_tuple(mp::ConnectStream<InitInterface>(loop, fd), pid);
}
static void LogPrint(bool raise, const std::string& message)
{
diff --git i/src/ipc/libmultiprocess/example/printer.cpp w/src/ipc/libmultiprocess/example/printer.cpp
index ccaed6890c..924c651784 100644
--- i/src/ipc/libmultiprocess/example/printer.cpp
+++ w/src/ipc/libmultiprocess/example/printer.cpp
@@ -1,11 +1,12 @@
// Copyright (c) 2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <fstream>
+#include <charconv>
#include <init.capnp.h>
#include <init.capnp.proxy.h> // NOLINT(misc-include-cleaner)
#include <init.h>
#include <iostream>
#include <memory>
#include <mp/proxy-io.h>
@@ -34,13 +35,17 @@ static void LogPrint(bool raise, const std::string& message)
int main(int argc, char** argv)
{
if (argc != 2) {
std::cout << "Usage: mpprinter <fd>\n";
return 1;
}
+ int fd;
+ if (std::from_chars(argv[1], argv[1] + strlen(argv[1]), fd).ec != std::errc{}) {
+ std::cout << argv[1] << " is not a number or is larger than an int\n";
+ return 1;
+ }
mp::EventLoop loop("mpprinter", LogPrint);
- const int fd = std::stoi(argv[1]);
std::unique_ptr<Init> init = std::make_unique<InitImpl>();
mp::ServeStream<InitInterface>(loop, fd, *init);
loop.loop();
return 0;
}
diff --git i/src/ipc/libmultiprocess/src/mp/gen.cpp w/src/ipc/libmultiprocess/src/mp/gen.cpp
index c4d9a51675..267c2837a6 100644
--- i/src/ipc/libmultiprocess/src/mp/gen.cpp
+++ w/src/ipc/libmultiprocess/src/mp/gen.cpp
@@ -10,12 +10,13 @@
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <errno.h>
#include <fstream>
#include <functional>
+#include <iostream>
#include <kj/array.h>
#include <kj/common.h>
#include <kj/filesystem.h>
#include <kj/memory.h>
#include <kj/string.h>
#include <map>
@@ -634,13 +635,13 @@ static void Generate(kj::StringPtr src_prefix,
h << "#endif\n";
}
int main(int argc, char** argv)
{
if (argc < 3) {
- fprintf(stderr, "Usage: " PROXY_BIN " SRC_PREFIX INCLUDE_PREFIX SRC_FILE [IMPORT_PATH...]\n");
+ std::cerr << "Usage: " << PROXY_BIN << " SRC_PREFIX INCLUDE_PREFIX SRC_FILE [IMPORT_PATH...]\n";
exit(1);
}
std::vector<kj::StringPtr> import_paths;
std::vector<kj::Own<const kj::ReadableDirectory>> import_dirs;
auto fs = kj::newDiskFilesystem();
auto cwd = fs->getCurrentPath();
diff --git i/src/ipc/libmultiprocess/src/mp/util.cpp w/src/ipc/libmultiprocess/src/mp/util.cpp
index 691ae0b34b..15c40b3373 100644
--- i/src/ipc/libmultiprocess/src/mp/util.cpp
+++ w/src/ipc/libmultiprocess/src/mp/util.cpp
@@ -3,12 +3,13 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <mp/config.h>
#include <mp/util.h>
#include <errno.h>
+#include <format>
#include <kj/common.h>
#include <kj/string-tree.h>
#include <pthread.h>
#include <sstream>
#include <stdio.h>
#include <string>
@@ -82,15 +83,13 @@ std::string LogEscape(const kj::StringTree& string)
string.visit([&](const kj::ArrayPtr<const char>& piece) {
if (result.size() > MAX_SIZE) return;
for (const char c : piece) {
if (c == '\\') {
result.append("\\\\");
} else if (c < 0x20 || c > 0x7e) {
- char escape[4];
- snprintf(escape, 4, "\\%02x", c);
- result.append(escape);
+ result.append(std::format("\\{:02x}", c));
} else {
result.push_back(c);
}
if (result.size() > MAX_SIZE) {
result += "...";
break;
diff --git i/src/ipc/libmultiprocess/test/mp/test/test.cpp w/src/ipc/libmultiprocess/test/mp/test/test.cpp
index 7721d41ff6..7fc64f6741 100644
--- i/src/ipc/libmultiprocess/test/mp/test/test.cpp
+++ w/src/ipc/libmultiprocess/test/mp/test/test.cpp
@@ -8,12 +8,13 @@
#include <mp/test/foo.h>
#include <capnp/capability.h>
#include <cstdio>
#include <future>
#include <functional>
+#include <iostream>
#include <memory>
#include <kj/common.h>
#include <kj/memory.h>
#include <kj/test.h>
#include <string>
#include <thread>
@@ -24,13 +25,15 @@ namespace test {
KJ_TEST("Call FooInterface methods")
{
std::promise<std::unique_ptr<ProxyClient<messages::FooInterface>>> foo_promise;
std::function<void()> disconnect_client;
std::thread thread([&]() {
- EventLoop loop("mptest", [](bool raise, const std::string& log) { printf("LOG%i: %s\n", raise, log.c_str()); });
+ EventLoop loop("mptest", [](bool raise, const std::string& log) {
+ std::cout << "LOG" << raise << ": " << log << "\n";
+ });
auto pipe = loop.m_io_context.provider->newTwoWayPipe();
auto connection_client = std::make_unique<Connection>(loop, kj::mv(pipe.ends[0]));
auto foo_client = std::make_unique<ProxyClient<messages::FooInterface>>(
connection_client->m_rpc_system->bootstrap(ServerVatId().vat_id).castAs<messages::FooInterface>(),
connection_client.get(), /* destroy_connection= */ false);
diff --git i/test/lint/lint-locale-dependence.py w/test/lint/lint-locale-dependence.py
index 1b1aeffdcb..d84e458bb1 100755
--- i/test/lint/lint-locale-dependence.py
+++ w/test/lint/lint-locale-dependence.py
@@ -48,13 +48,12 @@ KNOWN_VIOLATIONS = [
"src/wallet/bdb.cpp:.*DbEnv::strerror", # False positive
"src/util/syserror.cpp:.*strerror", # Outside this function use `SysErrorString`
]
REGEXP_EXTERNAL_DEPENDENCIES_EXCLUSIONS = [
"src/crypto/ctaes/",
- "src/ipc/libmultiprocess/",
"src/leveldb/",
"src/secp256k1/",
"src/minisketch/",
"src/tinyformat.h",
]
</details>
And also another one to still run test_runner on src/ipc/libmultiprocess/ but only skip std::filesystem check for example.cpp and the include guard test for the entire src/ipc/libmultiprocess/:
<details>
<summary>[patch] run test_runner on libmultiprocess</summary>
diff --git i/test/lint/lint-include-guards.py w/test/lint/lint-include-guards.py
index 77af05c1c2..ed10deaa90 100755
--- i/test/lint/lint-include-guards.py
+++ w/test/lint/lint-include-guards.py
@@ -17,12 +17,13 @@ from lint_ignore_dirs import SHARED_EXCLUDED_SUBTREES
HEADER_ID_PREFIX = 'BITCOIN_'
HEADER_ID_SUFFIX = '_H'
EXCLUDE_FILES_WITH_PREFIX = ['contrib/devtools/bitcoin-tidy',
'src/crypto/ctaes',
+ 'src/ipc/libmultiprocess',
'src/tinyformat.h',
'src/bench/nanobench.h',
'src/test/fuzz/FuzzedDataProvider.h'] + SHARED_EXCLUDED_SUBTREES
def _get_header_file_lst() -> list[str]:
diff --git i/test/lint/lint_ignore_dirs.py w/test/lint/lint_ignore_dirs.py
index 7525eac341..af9ee7ef6b 100644
--- i/test/lint/lint_ignore_dirs.py
+++ w/test/lint/lint_ignore_dirs.py
@@ -1,6 +1,5 @@
SHARED_EXCLUDED_SUBTREES = ["src/leveldb/",
"src/crc32c/",
"src/secp256k1/",
"src/minisketch/",
- "src/ipc/libmultiprocess/",
]
diff --git i/test/lint/test_runner/src/main.rs w/test/lint/test_runner/src/main.rs
index fe77a98c29..a633f5d43d 100644
--- i/test/lint/test_runner/src/main.rs
+++ w/test/lint/test_runner/src/main.rs
@@ -284,13 +284,13 @@ fn lint_std_filesystem() -> LintResult {
.args([
"grep",
"--line-number",
"std::filesystem",
"--",
"./src/",
- ":(exclude)src/ipc/libmultiprocess/",
+ ":(exclude)src/ipc/libmultiprocess/example/example.cpp",
":(exclude)src/util/fs.h",
])
.status()
.expect("command error")
.success();
if found {
</details>