faultInjectionPlaybook.md 1.9 KB

故障注入与稳定性验证(主机侧可选)

范围

  • 用于主机侧或实验环境验证失败路径。
  • RT-Thread 板端资源紧张时可不执行本流程。
  • 所有权口径见 ownershipAndErrors.md

目标

  • 验证分配失败场景下的可恢复性。
  • 覆盖 Parse/Create/Add/Insert/Replace/Print 的失败分支。

注入策略

  • 固定第 N 次分配失败(稳定复现)。
  • 按概率失败(压力回归)。
  • 按调用点标签失败(精确定位)。

包装器示例

#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include "RyanJson.h"

typedef struct
{
    uint32_t allocCount;
    uint32_t failAt;
} jsonFaultState_t;

static jsonFaultState_t gFaultState = {0U, 0U};

static void *faultMalloc(size_t size)
{
    gFaultState.allocCount++;
    if ((0U != gFaultState.failAt) && (gFaultState.allocCount == gFaultState.failAt))
    {
        return NULL;
    }
    return malloc(size);
}

static void faultFree(void *ptr)
{
    free(ptr);
}

static void *faultRealloc(void *ptr, size_t size)
{
    gFaultState.allocCount++;
    if ((0U != gFaultState.failAt) && (gFaultState.allocCount == gFaultState.failAt))
    {
        return NULL;
    }
    return realloc(ptr, size);
}

建议检查点

  • Parse 失败:返回 NULL,无泄漏。
  • Add/Insert 失败:返回 false;游离 item 由库侧清理,非游离 item 失败不消费。
  • Replace 失败:返回 false,item 仍由调用方持有(可继续复用或释放)。
  • Print 失败:返回 NULL,原 Json 树仍可正常释放。

结果判定

  • 无崩溃。
  • 无泄漏。
  • 返回值与所有权语义与头文件一致。

依据(仓库内)

  • RyanJson/RyanJsonItem.cRyanJsonInsertRyanJsonReplaceByKey/ByIndex
  • test/unityTest/cases/core/testCreate.ctest/unityTest/cases/core/testReplace.c
  • test/fuzzer/cases/fuzzerCreate.ctest/fuzzer/cases/fuzzerReplace.c