Skip to content

Commit 447c703

Browse files
committed
[代码质量与功能优化]: 主要代码质量优化、修复潜在漏洞及功能改进
- 更新 `.clang-tidy` 配置文件,调整代码检查规则,禁用部分不适用的检查项,增加更多潜在问题检测规则,提高代码静态分析覆盖率 - 优化 GitHub Actions 工作流,扩展忽略规则,避免误报,提升 CI 检测效率 - 改进多种搜索算法实现(顺序、二分、斐波那契等),统一变量命名规范,增强代码可读性 - 调整 Curl 相关模块(文件工具、HTTP 客户端等),优化类型使用(如将 `double` 改为 `int64_t`),增加参数校验,提升代码健壮性 - 完善设计模式示例(工厂模式、单例模式等),添加单元测试,增强线程安全性验证 - 优化服务器模块(套接字操作等),改进函数参数命名,规范代码风格 - 重构线程相关模块(线程类、线程池等),调整类型定义(如使用 `uint64_t` 等),增加 `[[nodiscard]]` 注解,提升代码语义清晰度 - 更新工具类和宏定义(如 `ScopeGuard`、对象操作宏等),增强资源管理安全性,规范拷贝/移动语义 - 新增 `utils/utils.hpp` 文件,定义 `UNUSED` 宏,便于处理未使用变量警告 - 修正 README 文档中部分内容顺序和格式,提升文档可读性,确保信息准确完整
1 parent c4f6733 commit 447c703

30 files changed

+408
-318
lines changed

.clang-tidy

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
1-
---
2-
Checks: 'clang-analyzer-*,readability-*,performance-*,modernize-*,bugprone-*,cert-*,portability-*,llvm-*,google-*'
3-
WarningsAsErrors: ''
1+
Checks: >
2+
clang-analyzer-*,
3+
bugprone-*,
4+
performance-*,
5+
cert-*,
6+
misc-*,
7+
modernize-*,
8+
cppcoreguidelines-*,
9+
concurrency-*,
10+
-modernize-use-trailing-return-type,
11+
-cppcoreguidelines-avoid-magic-numbers,
12+
-llvm-header-guard,
13+
-readability-identifier-length,
14+
-readability-magic-numbers,
15+
-modernize-pass-by-value,
16+
-cert-err58-cpp,
17+
-hicpp-exception-baseclass
18+
19+
WarningsAsErrors: >
20+
clang-analyzer-*,
21+
bugprone-*,
22+
performance-*,
23+
cert-*,
24+
misc-*,
25+
concurrency-mt-unsafe,
26+
concurrency-thread-canceltype,
27+
cppcoreguidelines-pro-type-*,
28+
cppcoreguidelines-owning-memory,
29+
cppcoreguidelines-no-malloc,
30+
hicpp-noexcept,
31+
performance-no-int-to-ptr,
32+
performance-trivially-destructible,
33+
bugprone-exception-escape
34+
435
HeaderFilterRegex: '.'
5-
AnalyzeTemporaryDtors: false
6-
FormatStyle: none
7-
User: user
36+
AnalyzeTemporaryDtors: true
37+
FormatStyle: file
38+
User: user

.github/workflows/cpp_linter.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
step-summary: true
4949
database: build
5050
ignore: .github | build
51-
ignore-tidy: .github | MonitorDir/monitordir_win.cc | MonitorDir/monitordir_mac.cc
51+
ignore-tidy: .github | Client | Icmp| Server | MonitorDir/monitordir_win.cc | MonitorDir/monitordir_mac.cc | utils
5252

5353
- name: Fail fast?!
5454
if: steps.linter.outputs.clang-tidy-checks-failed > 0

Algorithm/Search/search.hpp

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
// 顺序查找
1010
template<typename T>
11-
auto sequential_search(const std::vector<T> &v, const T &value) -> int
11+
auto sequential_search(const std::vector<T> &vec, const T &value) -> int
1212
{
13-
for (int i = 0; i < v.size(); ++i) { // 从头到尾遍历
14-
if (v[i] == value) { // 如果找到了,就返回下标
13+
for (int i = 0; i < vec.size(); ++i) { // 从头到尾遍历
14+
if (vec[i] == value) { // 如果找到了,就返回下标
1515
return i;
1616
}
1717
}
@@ -20,15 +20,15 @@ auto sequential_search(const std::vector<T> &v, const T &value) -> int
2020

2121
// 二分查找
2222
template<typename T>
23-
auto binary_search(const std::vector<T> &v, const T &value) -> int
23+
auto binary_search(const std::vector<T> &vec, const T &value) -> int
2424
{
2525
int low = 0; // 最小下标
26-
int high = v.size() - 1; // 最大下标
26+
int high = vec.size() - 1; // 最大下标
2727
while (low <= high) { // 当最小下标小于等于最大下标时
2828
int mid = (low + high) / 2; // 取中间下标
29-
if (v[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
29+
if (vec[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
3030
return mid;
31-
} else if (v[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
31+
} else if (vec[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
3232
low = mid + 1;
3333
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
3434
high = mid - 1;
@@ -39,23 +39,23 @@ auto binary_search(const std::vector<T> &v, const T &value) -> int
3939

4040
// 斐波那契查找
4141
template<typename T>
42-
auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
42+
auto fibonacci_search(const std::vector<T> &vec, const T &value) -> int
4343
{
44-
std::vector<int> fibonacci{1, 1}; // 斐波那契数列
45-
while (fibonacci.back() < v.size()) { // 生成斐波那契数列
44+
std::vector<int> fibonacci{1, 1}; // 斐波那契数列
45+
while (fibonacci.back() < vec.size()) { // 生成斐波那契数列
4646
fibonacci.push_back(fibonacci[fibonacci.size() - 1] + fibonacci[fibonacci.size() - 2]);
4747
}
4848
int low = 0; // 最小下标
49-
int high = v.size() - 1; // 最大下标
49+
int high = vec.size() - 1; // 最大下标
5050
int k = fibonacci.size() - 1; // 斐波那契数列的下标
5151
while (low <= high) { // 当最小下标小于等于最大下标时
5252
int mid = low + fibonacci[k - 1] - 1; // 取黄金分割点
53-
if (mid >= v.size()) { // 如果黄金分割点大于等于数组长度
54-
mid = v.size() - 1; // 就将黄金分割点设置为数组最后一个元素的下标
53+
if (mid >= vec.size()) { // 如果黄金分割点大于等于数组长度
54+
mid = vec.size() - 1; // 就将黄金分割点设置为数组最后一个元素的下标
5555
}
56-
if (v[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
56+
if (vec[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
5757
return mid;
58-
} else if (v[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
58+
} else if (vec[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
5959
low = mid + 1;
6060
k -= 2;
6161
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
@@ -68,13 +68,13 @@ auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
6868

6969
// 线性索引查找
7070
template<typename T>
71-
auto linear_index_search(const std::vector<T> &v, const T &value) -> int
71+
auto linear_index_search(const std::vector<T> &vec, const T &value) -> int
7272
{
73-
std::vector<T> index; // 索引
74-
index.push_back(v[0]); // 第一个索引为第一个元素
75-
for (int i = 1; i < v.size(); ++i) { // 生成索引
76-
if (v[i] > index.back()) { // 如果当前元素大于索引的最后一个元素
77-
index.push_back(v[i]);
73+
std::vector<T> index; // 索引
74+
index.push_back(vec[0]); // 第一个索引为第一个元素
75+
for (int i = 1; i < vec.size(); ++i) { // 生成索引
76+
if (vec[i] > index.back()) { // 如果当前元素大于索引的最后一个元素
77+
index.push_back(vec[i]);
7878
}
7979
}
8080
int low = 0; // 最小下标
@@ -94,7 +94,7 @@ auto linear_index_search(const std::vector<T> &v, const T &value) -> int
9494

9595
// KMP查找
9696
template<typename T>
97-
auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
97+
auto kmp_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
9898
{
9999
std::vector<int> next(pattern.size()); // next数组
100100
next[0] = -1; // next数组的第一个元素为-1
@@ -109,11 +109,11 @@ auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
109109
next[i] = k; // 将k赋值给next数组的当前元素
110110
}
111111
k = -1; // next数组的下标
112-
for (int i = 0; i < v.size(); ++i) {
113-
while (k > -1 && pattern[k + 1] != v[i]) { // 如果k大于-1且下一个元素不等于当前元素
112+
for (int i = 0; i < vec.size(); ++i) {
113+
while (k > -1 && pattern[k + 1] != vec[i]) { // 如果k大于-1且下一个元素不等于当前元素
114114
k = next[k];
115115
}
116-
if (pattern[k + 1] == v[i]) { // 如果下一个元素等于当前元素
116+
if (pattern[k + 1] == vec[i]) { // 如果下一个元素等于当前元素
117117
++k;
118118
}
119119
if (k == pattern.size() - 1) { // 如果k等于模式串的最后一个元素的下标
@@ -139,7 +139,7 @@ auto move_by_suffix(int j, const std::vector<int> &suffix, const std::vector<boo
139139
}
140140
// BM查找
141141
template<typename T>
142-
auto bm_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
142+
auto bm_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
143143
{
144144
std::vector<int> bc(256, -1); // 坏字符哈希表
145145
for (int i = 0; i < pattern.size(); ++i) { // 生成坏字符哈希表
@@ -161,71 +161,71 @@ auto bm_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
161161
}
162162
}
163163
int i = 0;
164-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
164+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
165165
int j = pattern.size() - 1;
166-
while (j >= 0 && v[i + j] == pattern[j]) { // 从后往前比较
166+
while (j >= 0 && vec[i + j] == pattern[j]) { // 从后往前比较
167167
--j;
168168
}
169169
if (j == -1) { // 如果模式串的所有元素都匹配了
170170
return i;
171171
}
172-
i += std::max(move_by_suffix(j, suffix, prefix), j - bc[v[i + j]]); // 将模式串向后移动
172+
i += std::max(move_by_suffix(j, suffix, prefix), j - bc[vec[i + j]]); // 将模式串向后移动
173173
}
174174
return -1; // not found
175175
}
176176

177177
// Sunday查找
178178
template<typename T>
179-
auto sunday_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
179+
auto sunday_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
180180
{
181181
std::vector<int> bc(256, -1); // 坏字符哈希表
182182
for (int i = 0; i < pattern.size(); ++i) { // 生成坏字符哈希表
183183
bc[pattern[i]] = i;
184184
}
185185
int i = 0;
186-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
186+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
187187
int j = 0;
188-
while (j < pattern.size() && v[i + j] == pattern[j]) { // 从前往后比较
188+
while (j < pattern.size() && vec[i + j] == pattern[j]) { // 从前往后比较
189189
++j;
190190
}
191191
if (j == pattern.size()) { // 如果模式串的所有元素都匹配了
192192
return i;
193193
}
194-
if (i + pattern.size() == v.size()) { // 如果模式串的最后一个元素在主串中不存在
195-
return -1; // not found
194+
if (i + pattern.size() == vec.size()) { // 如果模式串的最后一个元素在主串中不存在
195+
return -1; // not found
196196
}
197-
i += pattern.size() - bc[v[i + pattern.size()]]; // 将模式串向后移动
197+
i += pattern.size() - bc[vec[i + pattern.size()]]; // 将模式串向后移动
198198
}
199199
return -1; // not found
200200
}
201201

202202
// Rabin-Karp查找
203203
template<typename T>
204-
auto rabin_karp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
204+
auto rabin_karp_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
205205
{
206206
int pattern_hash = 0; // 模式串的哈希值
207207
for (int i = 0; i < pattern.size(); ++i) {
208208
pattern_hash += pattern[i];
209209
}
210210
int v_hash = 0; // 主串的哈希值
211211
for (int i = 0; i < pattern.size(); ++i) {
212-
v_hash += v[i];
212+
v_hash += vec[i];
213213
}
214214
int i = 0;
215-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
216-
if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
215+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
216+
if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
217217
int j = 0;
218-
while (j < pattern.size() && v[i + j] == pattern[j]) { // 从前往后比较
218+
while (j < pattern.size() && vec[i + j] == pattern[j]) { // 从前往后比较
219219
++j;
220220
}
221221
if (j == pattern.size()) { // 如果模式串的所有元素都匹配了
222222
return i;
223223
}
224224
}
225-
if (i + pattern.size() == v.size()) { // 如果模式串的最后一个元素在主串中不存在
226-
return -1; // not found
225+
if (i + pattern.size() == vec.size()) { // 如果模式串的最后一个元素在主串中不存在
226+
return -1; // not found
227227
}
228-
v_hash += v[i + pattern.size()] - v[i]; // 将模式串向后移动
228+
v_hash += vec[i + pattern.size()] - vec[i]; // 将模式串向后移动
229229
++i;
230230
}
231231
return -1; // not found

Curl/file_utils.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void assertFileData(const std::string &filename, const std::string &data)
4040
EXPECT_EQ(fileData, data);
4141
}
4242

43-
auto formatBytes(double value, int precision) -> std::string
43+
auto formatBytes(int64_t value, int precision) -> std::string
4444
{
4545
std::vector<std::string> units = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
4646

Curl/file_utils.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ void removeFile(const std::string &filename);
88

99
void assertFileData(const std::string &filename, const std::string &data);
1010

11-
auto formatBytes(double value, int precision = 2) -> std::string;
11+
auto formatBytes(int64_t value, int precision = 2) -> std::string;

Curl/httpclient.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@ class HttpClient::HttpClientPrivate
2323
setHeaderCallback();
2424
}
2525

26-
void setVerbose()
26+
void setVerbose() const
2727
{
2828
assert(curl != nullptr);
2929
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
3030
}
3131

32-
void setHeaderCallback()
32+
void setHeaderCallback() const
3333
{
3434
assert(curl != nullptr);
3535
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, headerCallback);
3636
curl_easy_setopt(curl, CURLOPT_HEADERDATA, q_ptr);
3737
}
3838

39-
void setErrorCallback()
39+
void setErrorCallback() const
4040
{
4141
assert(curl != nullptr);
4242
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, q_ptr->d_ptr->errorBuffer.data());
@@ -46,6 +46,8 @@ class HttpClient::HttpClientPrivate
4646
{
4747
assert(curl != nullptr);
4848
for (const auto &[key, value] : std::as_const(headers)) {
49+
std::string data = key;
50+
data += ": " + value;
4951
this->headers = curl_slist_append(this->headers, (key + ": " + value).c_str());
5052
}
5153
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, this->headers);
@@ -66,7 +68,7 @@ class HttpClient::HttpClientPrivate
6668
headers = nullptr;
6769
}
6870

69-
void printError()
71+
void printError() const
7072
{
7173
if (!errorBuffer.empty()) {
7274
std::cerr << "Error: " << errorBuffer << std::endl;
@@ -91,7 +93,7 @@ class HttpClient::HttpClientPrivate
9193
{
9294
auto *client = static_cast<HttpClient *>(userdata);
9395
assert(client->d_ptr->file.is_open());
94-
client->d_ptr->file.write(ptr, size * nmemb);
96+
client->d_ptr->file.write(ptr, static_cast<std::streamsize>(size * nmemb));
9597
return size * nmemb;
9698
}
9799

@@ -111,7 +113,7 @@ class HttpClient::HttpClientPrivate
111113
auto *client = static_cast<HttpClient *>(userdata);
112114
auto &file = client->d_ptr->file;
113115
assert(file.is_open());
114-
file.read(ptr, size * nmemb);
116+
file.read(ptr, static_cast<std::streamsize>(size * nmemb));
115117
return file.gcount();
116118
}
117119

Curl/httpclient_async.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <utility>
1414
#include <vector>
1515

16-
class HttpClientAsync::HttpClientAsyncPrivate
16+
class HttpClientAsync::HttpClientAsyncPrivate : noncopyable
1717
{
1818
public:
1919
struct Context

0 commit comments

Comments
 (0)