skills/oh-memory-leak-detection/SKILL.md
--- name: memory-leak-detection description: Detect and fix NAPI memory leaks in OpenHarmony Ability Runtime. Use when reviewing NAPI code for memory leaks, especially functions that: (1) Return napi_value, (2) Have napi_value& parameters, (3) Call napi_create_* functions, (4) Set properties with temporary napi_value variables, (5) Work in async callbacks. See references/background.md for detailed memory management principles. --- # NAPI Memory Leak Detection ## Quick Start Functions working
npx skillsauth add openharmonyinsight/openharmony-skills skills/oh-memory-leak-detectionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Functions working with napi_value need scope management to prevent leaks.
Detection Checklist:
napi_value?napi_value& parameter?napi_create_*?napi_value variables?HandleScope?For detailed background on JS/C++ memory management, see references/background.md
Use HandleEscape when returning napi_value to parent scope.
// ❌ LEAK
napi_value Func(napi_env env) {
napi_value result = nullptr;
napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &result);
return result;
}
// ✅ FIXED
napi_value Func(napi_env env) {
HandleEscape handleEscape(env);
napi_value result = nullptr;
napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &result);
return handleEscape.Escape(result);
}
Use HandleScope when receiving napi_value& as output parameter.
// ❌ LEAK
void Func(napi_env env, napi_value& objValue) {
napi_value temp = nullptr;
napi_new_instance(env, cls, 0, nullptr, &temp);
objValue = temp;
}
// ✅ FIXED
void Func(napi_env env, napi_value& objValue) {
HandleScope handleScope(env);
napi_value temp = nullptr;
napi_new_instance(env, cls, 0, nullptr, &temp);
objValue = temp;
}
Temporary napi_value variables created during property setting need management.
// ❌ LEAK
napi_value CreateInfo(napi_env env, const Data& data) {
napi_value obj = nullptr;
napi_create_object(env, &obj);
napi_value name = CreateJsValue(env, data.name); // Leak
napi_value pid = CreateJsValue(env, data.pid); // Leak
napi_set_named_property(env, obj, "name", name);
napi_set_named_property(env, obj, "pid", pid);
return obj;
}
// ✅ FIXED
napi_value CreateInfo(napi_env env, const Data& data) {
HandleEscape handleEscape(env);
napi_value obj = nullptr;
napi_create_object(env, &obj);
napi_value name = CreateJsValue(env, data.name);
napi_value pid = CreateJsValue(env, data.pid);
napi_set_named_property(env, obj, "name", name);
napi_set_named_property(env, obj, "pid", pid);
return handleEscape.Escape(obj);
}
When calling functions that return napi_value, the returned value needs scope management.
// ❌ LEAK
bool Func(napi_env env) {
auto executorNapiVal = jsObj_->GetNapiValue();
// executorNapiVal escapes when function returns
}
// ✅ FIXED
bool Func(napi_env env) {
HandleScope handleScope(env);
auto executorNapiVal = jsObj_->GetNapiValue();
// Use executorNapiVal within this scope
}
Async tasks need their own HandleScope to manage napi_value created in callbacks.
// ❌ LEAK
void AsyncBad(napi_env env, napi_value callback) {
std::thread([env, callback]() {
napi_value result = nullptr;
napi_create_string_utf8(env, "async result", NAPI_AUTO_LENGTH, &result);
}).detach();
}
// ✅ FIXED
void AsyncGood(napi_env env, napi_value callback, std::shared_ptr<AbilityHandler> handler) {
std::string data = "async result";
auto task = [env, callback, data]() {
HandleScope handleScope(env);
napi_value result = nullptr;
napi_create_string_utf8(env, data.c_str(), NAPI_AUTO_LENGTH, &result);
napi_call_function(env, callback, 1, &result, nullptr);
};
handler->PostTask(task, "AsyncTask");
}
When napi_value is used in conditional checks, it needs scope management.
// ❌ LEAK
napi_value Func1(napi_env env) {
napi_value xxx = nullptr;
napi_create_double(env, 42.0, &xxx);
return xxx;
}
bool TestFunc(napi_env env) {
if (Func1(env) == someValue) {
// Func1 returns napi_value that leaks
}
return true;
}
// ✅ FIXED
napi_value Func1(napi_env env) {
HandleEscape handleEscape(env);
napi_value xxx = nullptr;
napi_create_double(env, 42.0, &xxx);
return handleEscape.Escape(xxx);
}
napi_value FunctionName(napi_env env, /* parameters */) {
HandleEscape handleEscape(env);
// ... function body ...
return handleEscape.Escape(result);
}
void FunctionName(napi_env env, napi_value& output, /* parameters */) {
HandleScope handleScope(env);
// ... function body ...
output = value;
}
napi_value CreateJsObject(napi_env env, const DataType& data) {
HandleEscape handleEscape(env);
napi_value obj = nullptr;
napi_create_object(env, &obj);
napi_value prop1 = CreateJsValue(env, data.field1);
napi_value prop2 = CreateJsValue(env, data.field2);
napi_set_named_property(env, obj, "prop1", prop1);
napi_set_named_property(env, obj, "prop2", prop2);
return handleEscape.Escape(obj);
}
Functions that commonly return napi_value and need scope management:
Create Functions:
Convert2JSValueCreateJsAppStateData, CreateJsAbilityStateData, CreateJsProcessDataCreateJsMissionInfo, CreateJsWant, CreateJsWantParamsCreateJsErrorWrap Functions:
WrapVoidToJS, WrapStringToJS, WrapInt32ToJSWrapConfiguration, WrapElementNameWrapWant, WrapWantAgent, WrapWantParamsWrapAbilityResultCustom Functions:
Any function with Create or Wrap in the name that returns napi_value
export ASAN_OPTIONS=detect_leaks=1
./build.sh --product-name <product> --build-target ability_runtime --ccache
// Call function repeatedly to detect memory growth
for (int i = 0; i < 10000; i++) {
auto result = FunctionToTest(env);
}
// Monitor memory usage for continuous growth
Wiki: https://wiki.huawei.com/domains/1048/wiki/8/WIKI202511108963910
Workflow:
napi_value to parent scopeHandleScope when receiving napi_value& as output parameternapi_create_* calls create JS objects that need scope managementHandleScopenapi_value variables must be managednapi_value need HandleEscapenapi_value used in expressions needs scope managementThese functions create JS objects and return napi_value:
Primitives:
napi_create_int32, napi_create_uint32, napi_create_int64napi_create_double, napi_create_bigint_int64, napi_create_bigint_uint64Strings:
napi_create_string_utf8, napi_create_string_utf16, napi_create_string_latin1Objects:
napi_create_object, napi_create_array, napi_create_array_with_lengthFunctions and Classes:
napi_create_function, napi_new_instancedevelopment
Run local code quality checks covering a subset of OpenHarmony gate CI (copyright, CodeArts C/C++) plus additional local checks (pylint/flake8, shellcheck/bashate, gn format). Use before committing to reduce gate failures. Triggers on: /oh-precommit-codecheck, "门禁检查", "门禁预检", "检查代码", "run codecheck", "check code quality", "lint my code", "代码检查", or after completing code implementation. WHEN to use: before git commit, before creating PR, after modifying C/C++/Python/Shell/GN files, when gate CI fails with codecheck defects, or when you want to preview what gate will flag.
development
OpenHarmony PR full lifecycle workflow. Five modes: - Commit: standardized commit with DCO sign-off and Issue linking - Create PR: commit + push to fork + create Issue + create PR on upstream - Fix Codecheck: fetch gate CI codecheck defects from a PR and auto-fix them - Review PR: fetch a PR's changes to local for code review - Fix Review: fetch unresolved review comments from a PR and auto-fix them Triggers on: /oh-pr-workflow, "提交代码", "创建PR", "提个PR", "commit", "修复告警", "修复门禁", "修复codecheck", "fix codecheck", "review pr", "review这个pr", "看下这个pr", "检视pr", "修复review", "修复检视意见", "fix review", or a GitCode PR URL with fix/review intent.
testing
分析 HM Desktop PRD 文档,提取需求信息、验证完整性、检查章节顺序(需求来源→需求背景→需求价值分析→竞品分析→需求描述)、检查 KEP 定义、检测需求冲突并生成结构化分析报告。适用于用户请求:(1) 分析或审查 PRD 文档, (2) 从需求中提取 KEP 列表, (3) 检查 PRD 完整性或一致性, (4) 将需求映射到模块架构, (5) 验证 PRD 格式合规性, (6) 验证竞品分析章节完整性。关键词:PRD分析, requirement extraction, KEP验证, completeness check, chapter order validation, 竞品分析检查, analyze PRD, 需求提取, 完整性检查, 章节顺序验证
development
基于 PRD 文档自动生成鸿蒙系统设计文档,包括架构设计文档和功能设计文档。生成前会分析 OpenHarmony 存量代码结构,确保与现有架构兼容。架构设计文档第2章必须为竞品方案分析,位于需求背景之后。适用于用户请求:(1) 生成架构设计文档, (2) 生成功能设计文档, (3) 从 PRD 生成设计文档, (4) 创建系统架构设计, (5) 编写功能规格说明, (6) 分析 OH 代码结构。关键词:architecture design, functional design, design doc, 竞品方案分析, OpenHarmony code analysis, 架构设计, 功能设计, 设计文档生成, OH代码分析, analyze codebase, competitor analysis