com um clique
logic-analyzer
深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
资深代码安全审计专家,进行商用前的地毯式安全审查,识别潜在漏洞、逻辑缺陷和合规性风险。内置历史真实问题提炼的已知缺陷模式库(257+ 条已闭环问题单),审计时必须对历史高发模式做同类排查,防止同类问题重复出现
针对指定 Kit 的对外 API 做全量一致性审计、实现缺陷扫描与测试用例完备度评估,输出 Markdown + CSV 双格式。 当用户提到"接口审计"、"API审计"、"资料一致性"、"实现bug扫描"、"一致性扫描"、"audit api"、 "interface audit"、"扫描接口"、"深度扫描api"、"测试用例完备度"、"测试覆盖度评估"、"用例缺失"、 "汇总到csv"、"导出csv"等,且上下文涉及对外 API(C API 或 JS API)时触发此 skill。 即使用户只说"帮我扫一下 xxxKit",也应触发。 支持用户口头指定 Kit 名(如 abilityKit、arkuiKit),自动定位 docs/interface/framework/service/test 路径。
代码检视总编排器:对指定路径或 Kit,自动选择并调度 codecheck 下各子 skill(deep-scan、external-input-audit、api-audit 等), 执行后把各维度产出跨维度去重、合并为一份统一的 codecheck_report_<scope>_<YYYYMMDD>.md 报告。 当用户表达通用代码检视意图时触发:"检视一下代码"、"帮我审一下"、"做一次 code review"、"代码审查"、 "review 一下"、"审一下这块代码"、"codecheck"、"代码检视"、"全面检视"、"生成检视报告"。 当用户指定单一维度(纯安全/纯 API/纯外部输入)时,不触发本 skill,直接调对应子 skill。 当用户明确说"深度扫描"时,优先触发 deep-scan 而非本 skill(deep-scan 是三层专用编排)。
对指定代码路径执行三层深度扫描:high-impact-bug-audit(高影响缺陷审计) → logic-analyzer(逻辑影响分析)→ security-review(安全审查)。 用于在代码审查、合入前检查、安全审计等场景下,对 C++/JS/TS 代码进行系统性风险排查。 触发方式: 1. 用户输入 /deep-scan {path} 2. 用户用自然语言表达“对某某路径做深度扫描/全面排查/安全审计/bug audit”等意图, 例如:“对 services/abilitymgr 做深度扫描”、“全面排查 frameworks/native 的高危 bug”、 “审计 interfaces/inner_api 的安全问题”。 输出:按 P0/P1/P2 优先级排序的 Excel 问题汇总表(规范输出)。 扫描范围默认排除 ets 和 cj 前缀的源文件;用户若通过自然语言明确要求包含,再另行确认。
对指定代码路径执行"外部输入 → 持久化"全链路健壮性审计。 识别从外部数据源(IPC/Parcel、HTTP 请求体、CLI 参数、配置文件、网络 socket) 到持久化目标(数据库、文件、缓存、日志)的危险链路,评估写入侧防御、 读取侧恢复、并发安全与日志注入等全生命周期风险。 触发方式: 1. 用户输入 /external_input_audit {path} 2. 用户用自然语言表达"外部输入排查"、"输入接口审计"、"持久化安全检查" "数据入口审计"、"输入校验扫描"、"接口健壮性排查"等意图。 输出:按 P0/P1/P2 优先级排序的 Excel 风险清单。
Systematically audit code for high-impact bugs across ability_base or similar codebases. Use when asked to find, review, scan, investigate, or prioritize P0/P1 risks such as crashes, hangs, deadlocks, OOM, illegal memory access, data corruption, destructive side effects, resource leaks, state pollution, permission bypass, serialization/IPC bugs, malformed input handling, file/path/archive parsing bugs, lifecycle bugs, concurrency races, or other severe reliability/security defects.
| name | logic_analyzer |
| description | 深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题 |
| version | 1.0.0 |
| author | AI Assistant |
| tags | ["logic","analysis","state machine","data flow","control flow","boundary condition","error handling"] |
| triggers | ["逻辑分析","logic analysis","逻辑检查","logic check","状态机","state machine","数据流","data flow","控制流","control flow","边界条件","boundary condition","错误处理","error handling"] |
本技能专注于深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题。不同于常规的代码审查,本技能重点关注:
┌─────────────────────────────────────────────────┐
│ 第一层:变更识别 (What Changed) │
│ - 识别变更的代码位置 │
│ - 分类变更类型(新增/修改/删除) │
│ - 识别变更的影响范围 │
├─────────────────────────────────────────────────┤
│ 第二层:逻辑分析 (Logic Analysis) │
│ - 控制流分析 │
│ - 数据流分析 │
│ - 状态机分析 │
│ - 约束条件分析 │
├─────────────────────────────────────────────────┤
│ 第三层:影响评估 (Impact Assessment) │
│ - 影响范围评估 │
│ - 风险等级评定 │
│ - 修复建议生成 │
└─────────────────────────────────────────────────┘
| 维度 | 检查内容 | 问题类型 |
|---|---|---|
| 控制流 | 分支、循环、条件判断 | 死代码、不可达代码、逻辑矛盾 |
| 数据流 | 变量定义、赋值、使用 | 未初始化、数据污染、类型不匹配 |
| 状态机 | 状态转换、转换条件 | 非法转换、状态不一致、死锁 |
| 边界条件 | 数组边界、空值、极值 | 越界、空指针、溢出 |
| 错误处理 | 错误码、异常、清理 | 遗漏错误路径、资源泄漏 |
| 并发控制 | 锁、原子操作、竞态 | 死锁、竞态条件、数据竞争 |
| 业务规则 | 约束、不变性、契约 | 规则违反、不变性破坏 |
#### 类型 1: 控制流变更
+ if (newCondition) { // 新增条件分支
doSomething();
}
#### 类型 2: 数据流变更
- int result = processA(); // 删除原有计算
+ int result = processB(); // 替换为新计算
#### 类型 3: 状态转换变更
- state = ACTIVE; // 修改状态转换目标
+ state = SUSPENDED;
#### 类型 4: 函数签名变更
- ErrCode Function(int id);
+ ErrCode Function(int id, Config config); // 新增参数
#### 类型 5: 错误处理变更
ret = DoSomething();
+ if (ret != ERR_OK) { // 新增错误处理
return ret;
+ }
直接影响的代码:
间接影响的代码:
可能影响的边界:
检测模式:
// ❌ 问题:永不为真的条件
if (constexpr_condition) { // constexpr_value 总是 false
// 这段代码永远不会执行
NeverExecuted();
}
// ❌ 问题:不可达的代码
return ERR_OK;
DoSomething(); // 永远不会执行
// ❌ 问题:重复的条件
if (condition) {
return A;
} else {
if (condition) { // 重复的条件
return B;
}
}
检测方法:
影响分析:
检测模式:
// ❌ 问题:互斥条件同时为真
if (x > 10 && x < 5) { // 永远不会为真
Impossible();
}
// ❌ 问题:冗余条件
if (value != nullptr) {
if (value != nullptr) { // 重复检查
use(value);
}
}
// ❌ 问题:条件覆盖矛盾
if (state == ACTIVE) {
return;
}
if (state == ACTIVE) { // 前面已经return,这里永远不会执行
doSomething();
}
检测方法:
检测模式:
// ❌ 问题:遗漏分支
enum State { ACTIVE, INACTIVE, SUSPENDED };
void HandleState(State state) {
if (state == ACTIVE) {
HandleActive();
} else if (state == INACTIVE) {
HandleInactive();
}
// 遗漏了 SUSPENDED 状态的处理!
}
// ❌ 问题:默认情况缺失
switch (type) {
case TYPE_A:
DoA();
break;
case TYPE_B:
DoB();
break;
// 缺少 default 分支!
}
// ✅ 正确:完整的条件覆盖
void HandleState(State state) {
if (state == ACTIVE) {
HandleActive();
} else if (state == INACTIVE) {
HandleInactive();
} else {
HILOG_ERROR("Unknown state: %{public}d", state);
HandleUnknown();
}
}
检测方法:
检测模式:
// ❌ 问题:使用未初始化的变量
int result;
if (condition) {
result = 10;
}
// 如果condition为false,result未初始化
return result; // 使用未初始化的值
// ❌ 问题:条件初始化
std::string data;
if (needData) {
data = GetData();
}
// 如果needData为false,data为空
ProcessData(data); // 可能处理空数据
// ✅ 正确:确保初始化
int result = DEFAULT_VALUE; // 默认值
if (condition) {
result = 10;
}
return result;
检测方法:
检测模式:
// ❌ 问题:外部数据未验证直接使用
void ProcessInput(const char* input) {
char buffer[100];
strcpy(buffer, input); // 危险:input可能超过100字节
ProcessBuffer(buffer);
}
// ❌ 问题:污染数据传播到敏感操作
void ExecuteCommand(const std::string& userCmd) {
std::string cmd = "sh -c '" + userCmd + "'"; // 危险:命令注入
system(cmd.c_str());
}
// ✅ 正确:验证和净化外部数据
void ProcessInput(const char* input) {
if (input == nullptr || strlen(input) >= 100) {
HILOG_ERROR("Invalid input");
return;
}
char buffer[100];
strncpy_s(buffer, sizeof(buffer), input, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
ProcessBuffer(buffer);
}
检测方法:
检测模式:
// ❌ 问题:有符号/无符号比较
int count = -1;
if (count < vector.size()) { // 危险:有符号与无符号比较
vector[count];
}
// ❌ 问题:枚举类型混用
enum Type { A = 0, B = 1 };
int value = 2;
Type type = static_cast<Type>(value); // 危险:无有效枚举值
// ❌ 问题:指针类型强转
void* ptr = malloc(100);
int* intPtr = static_cast<int*>(ptr);
*intPtr = 0x12345678; // 可能未对齐
// ✅ 正确:类型安全比较
size_t count = 0;
if (count < vector.size()) {
// 安全
}
检测方法:
检测模式:
// ❌ 问题:不合法的状态转换
enum State { CREATED, ACTIVATING, ACTIVE, DEACTIVATING };
void ChangeState(State newState) {
// 允许任何转换,包括非法的
currentState_ = newState;
}
// 示例非法转换:
// CREATED -> DEACTIVATING (跳过ACTIVATING和ACTIVE)
// ACTIVE -> CREATED (跳过DEACTIVATING)
// ✅ 正确:验证状态转换
bool ChangeState(State newState) {
switch (currentState_) {
case CREATED:
if (newState != ACTIVATING) {
HILOG_ERROR("Invalid transition: CREATED -> %{public}d", newState);
return false;
}
break;
case ACTIVATING:
if (newState != ACTIVE && newState != CREATED) {
return false;
}
break;
// ... 其他状态验证
}
currentState_ = newState;
return true;
}
检测方法:
检测模式:
// ❌ 问题:状态与实际数据不一致
class Account {
State state_;
bool isActive_;
void Activate() {
state_ = ACTIVE;
// 忘记更新 isActive_
}
bool IsActive() {
return isActive_; // 返回旧值
}
};
// ❌ 问题:多状态变量不同步
class Connection {
bool isConnected_;
bool isReady_;
bool hasError_;
void Connect() {
isConnected_ = true;
// isReady_ 未更新,导致不一致
}
};
// ✅ 正确:确保状态一致性
class Account {
State state_;
void Activate() {
state_ = ACTIVE;
// 单一状态源,无需同步多个变量
}
bool IsActive() {
return state_ == ACTIVE;
}
};
检测方法:
检测模式:
// ❌ 问题:无法到达最终状态
enum State { INIT, WAITING, PROCESSING, DONE };
void ProcessData() {
switch (state_) {
case INIT:
state_ = WAITING;
break;
case WAITING:
if (HasData()) {
state_ = PROCESSING;
}
// 如果没有数据,永远停留在WAITING
break;
case PROCESSING:
if (Success()) {
state_ = DONE;
} else {
state_ = WAITING; // 失败后回到WAITING
}
break;
}
// 没有超时机制,可能永远无法到达DONE
}
// ✅ 正确:添加超时和错误处理
void ProcessData() {
switch (state_) {
case INIT:
state_ = WAITING;
startTime_ = GetCurrentTime();
break;
case WAITING:
if (HasData()) {
state_ = PROCESSING;
} else if (GetCurrentTime() - startTime_ > TIMEOUT) {
state_ = DONE; // 超时退出
errorCode_ = ETIMEDOUT;
}
break;
// ...
}
}
检测方法:
检测模式:
// ❌ 问题:索引未验证
void ProcessArray(int* data, int size) {
for (int i = 0; i <= size; i++) { // 错误:应该是 i < size
data[i] = 0; // 越界访问
}
}
// ❌ 问题:边界计算错误
void CopyData(const std::vector<int>& src, int* dest, int destSize) {
memcpy(dest, src.data(), src.size() * sizeof(int)); // 未检查destSize
}
// ✅ 正确:边界验证
void ProcessArray(int* data, int size) {
if (data == nullptr || size <= 0) {
return;
}
for (int i = 0; i < size; i++) {
data[i] = 0;
}
}
void CopyData(const std::vector<int>& src, int* dest, int destSize) {
if (dest == nullptr || destSize < static_cast<int>(src.size())) {
HILOG_ERROR("Invalid buffer size");
return;
}
memcpy(dest, src.data(), src.size() * sizeof(int));
}
检测方法:
检测模式:
// ❌ 问题:未检查空指针
void ProcessData(Account* account) {
account->Update(); // account可能为nullptr
}
// ❌ 问题:检查后再次使用
void Process(Account* account) {
if (account != nullptr) {
DoSomething(account);
}
account->Update(); // 可能已经是nullptr
}
// ❌ 问题:函数调用后未验证返回值
Account* GetAccount(int id);
void UseAccount(int id) {
Account* account = GetAccount(id);
account->Process(); // GetAccount可能返回nullptr
}
// ✅ 正确:完整的空指针检查
void ProcessData(Account* account) {
if (account == nullptr) {
HILOG_ERROR("Account is null");
return;
}
account->Update();
}
void UseAccount(int id) {
Account* account = GetAccount(id);
if (account == nullptr) {
HILOG_ERROR("Account not found: %{public}d", id);
return;
}
account->Process();
}
检测方法:
检测模式:
// ❌ 问题:加法溢出
int AllocateSize(int count, int itemSize) {
return count * itemSize; // 可能溢出
}
// ❌ 问题:索引计算溢出
void AccessArray(std::vector<int>& data, int offset, int index) {
int pos = offset + index; // 可能溢出为负数
data[pos] = 0; // 负数转换为巨大的无符号数
}
// ❌ 问题:循环计数器溢出
for (int i = 0; i < count; i++) {
// 如果count是INT_MAX,i会溢出
ProcessItem(i);
}
// ✅ 正确:溢出检查
int AllocateSize(int count, int itemSize) {
if (count < 0 || itemSize < 0) {
return -1;
}
if (count > INT_MAX / itemSize) {
HILOG_ERROR("Size overflow");
return -1;
}
return count * itemSize;
}
检测方法:
检测模式:
// ❌ 问题:不检查返回值
void ProcessFile(const std::string& path) {
FILE* file = fopen(path.c_str(), "r"); // 未检查是否成功
char buffer[100];
fread(buffer, 1, 100, file); // file可能是nullptr
fclose(file);
}
// ❌ 问题:部分错误处理
ErrCode CreateAccount(const AccountInfo& info) {
if (!ValidateInfo(info)) {
return ERR_INVALID;
}
// 未检查数据库写入是否成功
database_->Insert(info);
// 未检查文件写入是否成功
WriteToFile(info);
return ERR_OK;
}
// ✅ 正确:完整的错误处理
ErrCode CreateAccount(const AccountInfo& info) {
if (!ValidateInfo(info)) {
return ERR_INVALID;
}
ErrCode ret = database_->Insert(info);
if (ret != ERR_OK) {
HILOG_ERROR("Database insert failed: %{public}d", ret);
return ret;
}
ret = WriteToFile(info);
if (ret != ERR_OK) {
HILOG_ERROR("File write failed: %{public}d", ret);
// 回滚数据库操作
database_->Delete(info.id);
return ret;
}
return ERR_OK;
}
检测方法:
检测模式:
// ❌ 问题:错误路径未释放资源
void ProcessData() {
char* buffer = new char[1024];
if (!ReadData(buffer)) {
return; // 泄漏buffer
}
delete[] buffer;
}
// ❌ 问题:文件句柄泄漏
void ProcessFile(const std::string& path) {
FILE* file = fopen(path.c_str(), "r");
if (file == nullptr) {
return;
}
char buffer[100];
if (fread(buffer, 1, 100, file) < 100) {
return; // 泄漏file句柄
}
fclose(file);
}
// ✅ 正确:使用RAII确保资源释放
void ProcessData() {
std::unique_ptr<char[]> buffer(new char[1024]);
if (!ReadData(buffer.get())) {
return; // 自动释放
}
}
void ProcessFile(const std::string& path) {
FILE* file = fopen(path.c_str(), "r");
if (file == nullptr) {
return;
}
// 使用RAII包装器
std::unique_ptr<FILE, decltype(&fclose)> fileGuard(file, fclose);
char buffer[100];
if (fread(buffer, 1, 100, file) < 100) {
return; // 自动关闭文件
}
}
检测方法:
检测模式:
// ❌ 问题:锁顺序不一致
void Thread1() {
std::lock_guard<std::mutex> lock1(mutex1_);
std::lock_guard<std::mutex> lock2(mutex2_);
// 操作
}
void Thread2() {
std::lock_guard<std::mutex> lock2(mutex2_); // 不同顺序
std::lock_guard<std::mutex> lock1(mutex1_);
// 可能死锁
}
// ❌ 问题:循环等待
void Process() {
std::lock_guard<std::mutex> lock(globalMutex_);
// 在持有锁的情况下调用可能获取同一锁的函数
Callback(); // 如果Callback也尝试获取globalMutex_,死锁
}
// ✅ 正确:一致的锁顺序
void Thread1() {
std::lock(mutex1_, mutex2_); // C++17 std::lock
std::lock_guard<std::mutex> lock1(mutex1_, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mutex2_, std::adopt_lock);
// 操作
}
void Thread2() {
std::lock(mutex1_, mutex2_); // 相同顺序
std::lock_guard<std::mutex> lock1(mutex1_, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mutex2_, std::adopt_lock);
// 操作
}
检测方法:
检测模式:
// ❌ 问题:检查-使用(Check-Then-Act)模式
if (instance_ == nullptr) { // 检查
instance_ = new Instance(); // 使用:多个线程可能同时执行
}
// ❌ 问题:非原子操作
int count_;
void Increment() {
count_++; // 非原子操作,三个步骤:读取、增加、写入
}
// ❌ 问题:状态不一致读取
class Account {
int balance_;
void Deposit(int amount) {
balance_ += amount;
}
int GetBalance() {
return balance_; // 可能读到部分更新的值
}
};
// ✅ 正确:使用原子操作或锁
std::atomic<int> count_;
void Increment() {
count_.fetch_add(1, std::memory_order_relaxed);
}
// 或使用锁
std::mutex mutex_;
int count_;
void Increment() {
std::lock_guard<std::mutex> lock(mutex_);
count_++;
}
检测方法:
检测模式:
// ❌ 问题:无保护的并发访问
int sharedData = 0;
void Thread1() {
sharedData = 100; // 写入,无保护
}
void Thread2() {
int value = sharedData; // 读取,无保护
// 数据竞争:未定义行为
}
// ❌ 问题:部分保护的访问
class Buffer {
std::mutex mutex_;
std::vector<int> data_;
void Add(int value) {
std::lock_guard<std::mutex> lock(mutex_);
data_.push_back(value);
}
int Size() {
return data_.size(); // 无保护读取
}
};
// ✅ 正确:完全保护的访问
class Buffer {
std::mutex mutex_;
std::vector<int> data_;
void Add(int value) {
std::lock_guard<std::mutex> lock(mutex_);
data_.push_back(value);
}
int Size() {
std::lock_guard<std::mutex> lock(mutex_);
return data_.size();
}
};
检测方法:
检测模式:
// ❌ 问题:破坏不变性
class AccountManager {
std::map<int, Account> accounts_;
int maxAccounts_; // 不变性:accounts_.size() <= maxAccounts_
ErrCode AddAccount(const Account& account) {
accounts_[account.id] = account;
// 未检查是否超过maxAccounts_
return ERR_OK;
}
};
// ❌ 问题:约束条件违反
class PriorityQueue {
std::vector<int> data_;
void Add(int value) {
data_.push_back(value);
// 忘记调整堆结构,破坏堆性质
}
};
// ✅ 正确:维护不变性
class AccountManager {
std::map<int, Account> accounts_;
int maxAccounts_;
ErrCode AddAccount(const Account& account) {
if (accounts_.size() >= maxAccounts_) {
HILOG_ERROR("Max accounts limit reached");
return ERR_LIMIT_REACHED;
}
accounts_[account.id] = account;
return ERR_OK;
}
};
检测方法:
检测模式:
// ❌ 问题:前置条件未验证
int Divide(int a, int b) {
// 前置条件:b != 0
return a / b; // 未验证前置条件
}
// ❌ 问题:后置条件不保证
int GetNextId() {
int nextId = currentId_++;
// 后置条件:返回的ID应该是唯一的
// 但如果currentId_溢出,可能返回已使用的ID
return nextId;
}
// ✅ 正确:契约式编程
int Divide(int a, int b) {
if (b == 0) {
HILOG_ERROR("Division by zero");
return 0; // 或抛出异常
}
return a / b;
}
int GetNextId() {
int nextId = currentId_;
if (currentId_ == INT_MAX) {
HILOG_ERROR("ID overflow");
return -1;
}
currentId_++;
return nextId;
}
检测方法:
死代码检测
逻辑矛盾检测
条件覆盖完整性
变量初始化
数据污染分析
类型安全
状态转换合法性
状态一致性
状态机活性
数组边界
空指针检查
整数溢出
错误路径完整性
资源管理
死锁预防
竞态条件
数据竞争
不变性维护
契约遵守
# 代码逻辑变更分析报告
## 1. 变更概览
### 变更文件
- `src/account_manager.cpp`: 45 行变更
- `include/account_manager.h`: 3 行变更
### 变更类型
- 控制流变更: 2 处
- 数据流变更: 1 处
- 状态转换变更: 1 处
### 影响范围评估
- 直接影响: AccountManager类及其3个调用者
- 间接影响: 可能影响所有依赖账户状态的模块
- 风险等级: **高** ⚠️
---
## 2. 逻辑问题详细分析
### 问题 1: 状态转换非法 (致命)
**位置**: `src/account_manager.cpp:123-127`
**问题描述**:
从CREATED状态直接转换到DEACTIVATED状态,跳过了ACTIVE状态。
**当前代码**:
```cpp
ErrCode AccountManager::DeactivateAccount(int id) {
accounts_[id].state_ = DEACTIVATED; // 非法转换
return ERR_OK;
}
影响:
修复建议:
ErrCode AccountManager::DeactivateAccount(int id) {
if (accounts_[id].state_ != ACTIVE) {
HILOG_ERROR("Cannot deactivate non-active account");
return ERR_INVALID_STATE;
}
accounts_[id].state_ = DEACTIVATED;
return ERR_OK;
}
严重等级: 🔴 致命
位置: src/account_manager.cpp:145-152
问题描述: CreateAccount函数未检查数据库插入是否成功。
当前代码:
ErrCode AccountManager::CreateAccount(const AccountInfo& info) {
if (!ValidateInfo(info)) {
return ERR_INVALID;
}
database_->Insert(info); // 未检查返回值
WriteToFile(info);
return ERR_OK;
}
影响:
修复建议:
ErrCode AccountManager::CreateAccount(const AccountInfo& info) {
if (!ValidateInfo(info)) {
return ERR_INVALID;
}
ErrCode ret = database_->Insert(info);
if (ret != ERR_OK) {
HILOG_ERROR("Database insert failed: %{public}d", ret);
return ret;
}
ret = WriteToFile(info);
if (ret != ERR_OK) {
HILOG_ERROR("File write failed: %{public}d", ret);
database_->Delete(info.id); // 回滚
return ret;
}
return ERR_OK;
}
严重等级: 🟠 严重
位置: src/account_manager.cpp:89-93
问题描述: Check-Then-Act模式导致竞态条件。
当前代码:
bool AccountManager::HasAccount(int id) {
if (accounts_.find(id) == accounts_.end()) {
return false;
}
return true;
}
影响:
修复建议:
bool AccountManager::HasAccount(int id) {
std::lock_guard<std::mutex> lock(mutex_);
return accounts_.find(id) != accounts_.end();
}
严重等级: 🟠 严重
AccountManager::DeactivateAccount(): 行为改变AccountManager::CreateAccount(): 错误处理不完整AccountManager::HasAccount(): 线程不安全HasAccount()的代码可能受影响本次代码变更引入了3个严重的逻辑问题,主要涉及:
建议: 修复所有致命和严重问题后再合并到主分支。
风险等级: 🔴 高风险
总体评价: ❌ 需要修复
---
## 6. 使用指南
### 6.1 调用技能
```bash
# 分析特定分支的代码变更
claude-code "使用logic_analyzer技能分析分支feature-xxx相对于main的代码逻辑变更"
# 分析特定文件的变更
claude-code "使用logic_analyzer技能分析src/account_manager.cpp文件的逻辑变更"
# 分析特定问题类型
claude-code "使用logic_analyzer技能检查状态机相关的逻辑问题"
1. 识别变更
├─ 获取变更文件列表
├─ 分类变更类型
└─ 识别影响范围
2. 执行分析
├─ 控制流分析
├─ 数据流分析
├─ 状态机分析
├─ 边界条件分析
├─ 错误处理分析
├─ 并发控制分析
└─ 业务规则分析
3. 生成报告
├─ 问题发现与分类
├─ 影响分析
├─ 风险评估
└─ 修复建议
| 版本 | 日期 | 变更 | 维护者 |
|---|---|---|---|
| v1.0 | 2026-04-01 | 初始版本,完整的逻辑分析框架 | AI Assistant |
文档结束