mit einem Klick
logic-analyzer
深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Menü
深度分析代码修改的逻辑影响,系统化地发现所有逻辑问题
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Basierend auf der SOC-Berufsklassifikation
资深代码安全审计专家,进行商用前的地毯式安全审查,识别潜在漏洞、逻辑缺陷和合规性风险。内置历史真实问题提炼的已知缺陷模式库(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 |
文档结束