当前位置:首页>java>嵌入式编程规范,还有这些黄金法则

嵌入式编程规范,还有这些黄金法则

  • 2026-02-08 18:57:22
嵌入式编程规范,还有这些黄金法则

在嵌入式开发中,代码的安全性和可维护性直接关系到产品的可靠性和开发效率。MISRA C(Motor Industry Software Reliability Association C)等编程规范标准作为开发指导就很有必要性。

编程规范

嵌入式系统的特殊性

嵌入式系统特点
资源受限
实时性要求
可靠性要求
难以调试
内存有限
CPU性能受限
响应时间严格
不能容忍延迟
长时间运行
无人值守
调试工具有限
问题难以复现

关键点

  • • 资源受限:内存和CPU资源有限,需要精确控制
  • • 实时性要求:系统必须及时响应,不能容忍不确定的延迟
  • • 可靠性要求:系统需要长时间稳定运行,错误可能导致严重后果
  • • 难以调试:生产环境难以复现问题,需要代码本身具有高可靠性

编程规范价值

方面
无规范代码
规范代码
可读性
风格混乱,难以理解
统一风格,易于阅读
可维护性
修改困难,容易引入新bug
结构清晰,易于维护
安全性
隐藏潜在风险
主动规避风险
团队协作
代码风格差异大
统一标准,协作顺畅
代码审查
审查效率低
有章可循,审查高效

十条黄金法则

法则1:禁止使用未初始化的变量

规则说明:所有变量在使用前必须显式初始化。

原因分析

未初始化变量
不确定的值
随机行为
难以调试
安全风险
问题难以复现
数据泄露
系统崩溃
  • • 未定义行为:未初始化的变量包含随机值,导致不可预测的行为
  • • 安全风险:可能泄露内存中的敏感信息
  • • 调试困难:问题难以复现,难以定位
  • • 标准要求:MISRA C规则8.5要求所有变量必须在使用前初始化

代码示例

// ❌ 错误示例:未初始化变量voidbad_example(void) {int value;           // 未初始化int result;    result = value * 10// 使用未初始化的value,结果不可预测printf("Result: %d\r\n", result);}// ✅ 正确示例:显式初始化voidgood_example(void) {int value = 0;       // 显式初始化为0int result = 0;    result = value * 10// 结果确定:0printf("Result: %d\r\n", result);}// ✅ 更好的做法:根据用途初始化voidbetter_example(void) {int counter = 0;     // 计数器初始化为0int sum = 0;         // 累加器初始化为0int max_value = INT_MIN;  // 最大值初始化为最小值int min_value = INT_MAX;  // 最小值初始化为最大值// 使用变量...}

法则2:必须检查所有函数返回值

规则说明:所有可能失败的函数调用都必须检查返回值。

原因分析

系统资源函数调用应用程序系统资源函数调用应用程序如果检查了返回值调用函数(未检查返回值)请求资源返回失败返回错误码(被忽略)继续执行(使用无效数据)系统崩溃/数据损坏调用函数返回错误码检查返回值错误处理/恢复
  • • 错误传播:忽略返回值可能导致错误在系统中传播
  • • 资源泄漏:内存分配失败未检查会导致后续操作使用NULL指针
  • • 数据完整性:I/O操作失败未检查会导致数据不一致
  • • 系统稳定性:错误累积最终导致系统崩溃

代码示例

// ❌ 错误示例:忽略返回值voidbad_example(void) {void *ptr = malloc(100);  // 未检查返回值strcpy(ptr, "data");       // 如果malloc失败,ptr为NULL,导致崩溃    FILE *fp = fopen("file.txt""r");  // 未检查返回值    fread(buffer, 1100, fp);          // 如果fopen失败,fp为NULL,导致崩溃int ret = send_data(data);  // 未检查返回值// 如果发送失败,数据丢失但程序继续执行}// ✅ 正确示例:检查所有返回值voidgood_example(void) {// 检查内存分配void *ptr = malloc(100);if (ptr == NULL) {printf("Memory allocation failed\r\n");return;  // 或执行错误恢复    }strcpy(ptr, "data");free(ptr);// 检查文件操作    FILE *fp = fopen("file.txt""r");if (fp == NULL) {printf("Failed to open file\r\n");return;    }size_t bytes_read = fread(buffer, 1100, fp);if (bytes_read != 100) {printf("Failed to read file completely\r\n");// 处理部分读取的情况    }    fclose(fp);// 检查函数返回值int ret = send_data(data);if (ret != 0) {printf("Failed to send data: %d\r\n", ret);// 执行错误恢复:重试、记录日志等        handle_send_error(ret);    }}// ✅ 更好的做法:使用宏简化错误检查#define CHECK_NULL(ptr, action) \    do { \if ((ptr) == NULL) { \            printf("NULL pointer at %s:%d\r\n", __FILE__, __LINE__); \            action; \        } \    } while(0)#define CHECK_RET(ret, action) \    do { \if ((ret) != 0) { \            printf("Function failed at %s:%d: %d\r\n", __FILE__, __LINE__, ret); \            action; \        } \    } while(0)voidbetter_example(void) {void *ptr = malloc(100);    CHECK_NULL(ptr, return);int ret = process_data(ptr);    CHECK_RET(ret, goto cleanup);cleanup:free(ptr);}

例外情况

// 例外1:明确知道不会失败的函数(但仍建议检查)void *ptr = malloc(0);  // 分配0字节,可能返回NULL或有效指针// 标准允许返回NULL,所以仍应检查// 例外2:某些标准库函数返回值可以安全忽略(需文档说明)(void)printf("Debug message\r\n");  // printf返回值通常可以忽略// 但建议使用(void)显式表示有意忽略// 例外3:在断言中使用的函数(断言失败会终止程序)assert(ptr != NULL);  // 如果ptr为NULL,程序终止,无需额外检查// 例外4:某些嵌入式特定函数(需根据文档判断)// 例如:某些硬件初始化函数在特定平台上保证成功// 但仍建议检查,因为平台可能变化

法则3:谨慎使用全局变量

规则说明:尽量避免使用全局变量,如必须使用,需严格管理。

原因分析

全局变量问题
可维护性
线程安全
测试困难
耦合度高
难以追踪修改
影响范围不明确
多线程竞争
数据不一致
难以隔离测试
状态依赖
模块间耦合
难以重构
  • • 可维护性差:全局变量可以在任何地方被修改,难以追踪
  • • 线程安全:多线程环境下容易产生竞争条件
  • • 测试困难:全局状态使单元测试变得困难
  • • 耦合度高:增加模块间的耦合,降低代码可重用性
  • • 命名冲突:容易与其他模块的变量名冲突

代码示例

// ❌ 错误示例:滥用全局变量int counter = 0;           // 全局变量int status = 0;char buffer[100];voidtask1(void) {    counter++;             // 任何函数都可以修改    status = 1;}voidtask2(void) {    counter++;             // 可能与其他任务冲突if (status == 1) {strcpy(buffer, "data");  // 可能覆盖其他任务的数据    }}// ✅ 正确示例:使用局部变量和参数传递intprocess_data(int input) {int counter = 0;       // 局部变量int status = 0;char buffer[100];// 使用局部变量处理    counter = input;    status = process(counter);return status;}// ✅ 更好的做法:使用结构体封装相关数据typedefstruct {int counter;int status;char buffer[100];task_context_t;intprocess_with_context(task_context_t *ctx, int input) {if (ctx == NULL) {return-1;    }    ctx->counter = input;    ctx->status = process(ctx->counter);return ctx->status;}// ✅ 如果必须使用全局变量:严格管理// 1. 使用static限制作用域staticint module_counter = 0;  // 仅在当前文件可见// 2. 提供访问函数(封装)intget_counter(void) {return module_counter;}voidset_counter(int value) {if (value >= 0) {  // 添加验证        module_counter = value;    }}// 3. 使用互斥锁保护(多线程环境)#include"freertos/FreeRTOS.h"#include"freertos/semphr.h"staticint shared_counter = 0;static SemaphoreHandle_t counter_mutex = NULL;voidinit_counter(void) {    counter_mutex = xSemaphoreCreateMutex();}intget_counter_safe(void) {int value;    xSemaphoreTake(counter_mutex, portMAX_DELAY);    value = shared_counter;    xSemaphoreGive(counter_mutex);return value;}voidset_counter_safe(int value) {    xSemaphoreTake(counter_mutex, portMAX_DELAY);    shared_counter = value;    xSemaphoreGive(counter_mutex);}

法则4:禁止使用goto语句

规则说明:避免使用goto语句,使用结构化编程替代。

原因分析

  • • 代码可读性:goto使程序流程难以追踪
  • • 维护困难:跳转目标可能很远,难以理解逻辑
  • • 错误风险:容易跳过重要的初始化或清理代码
  • • 标准要求:MISRA C规则15.1禁止使用goto

代码示例

// ❌ 错误示例:使用gotointbad_example(void) {int ret = 0;void *ptr1 = NULL;void *ptr2 = NULL;    ptr1 = malloc(100);if (ptr1 == NULL) {        ret = -1;goto error;  // 使用goto跳转    }    ptr2 = malloc(200);if (ptr2 == NULL) {        ret = -2;goto error;  // 多个goto目标,难以追踪    }// 处理逻辑...error:  // 错误处理标签if (ptr1) free(ptr1);if (ptr2) free(ptr2);return ret;}// ✅ 正确示例:使用结构化编程intgood_example(void) {int ret = 0;void *ptr1 = NULL;void *ptr2 = NULL;    ptr1 = malloc(100);if (ptr1 == NULL) {        ret = -1;// 直接返回,无需gotoreturn ret;    }    ptr2 = malloc(200);if (ptr2 == NULL) {        ret = -2;free(ptr1);  // 清理已分配的资源return ret;    }// 处理逻辑...// 正常清理free(ptr1);free(ptr2);return ret;}// ✅ 更好的做法:使用do-while(0)模式#define CLEANUP_AND_RETURN(ret_val) \    do { \if (ptr1) free(ptr1); \if (ptr2) free(ptr2); \        return ret_val; \    } while(0)intbetter_example(void) {int ret = 0;void *ptr1 = NULL;void *ptr2 = NULL;    ptr1 = malloc(100);if (ptr1 == NULL) {        CLEANUP_AND_RETURN(-1);    }    ptr2 = malloc(200);if (ptr2 == NULL) {        CLEANUP_AND_RETURN(-2);    }// 处理逻辑...    CLEANUP_AND_RETURN(0);}

法则5:限制函数复杂度

规则说明:函数应保持简单,圈复杂度不超过10。

原因分析

高复杂度函数
难以理解
难以测试
难以维护
容易出错
逻辑混乱
测试用例多
修改风险大
bug率高
  • • 可读性:复杂函数难以理解,增加认知负担
  • • 可测试性:需要大量测试用例覆盖所有分支
  • • 可维护性:修改复杂函数容易引入新bug
  • • 标准要求:MISRA C建议函数圈复杂度不超过10

代码示例

// ❌ 错误示例:函数过于复杂intcomplex_function(int type, int value, int mode, int flag) {int result = 0;if (type == 1) {if (value > 0) {if (mode == 1) {if (flag == 1) {                    result = value * 2;                } else {                    result = value * 3;                }            } else {if (flag == 1) {                    result = value + 10;                } else {                    result = value + 20;                }            }        } else {// 更多嵌套...        }    } elseif (type == 2) {// 更多复杂逻辑...    } else {// 更多分支...    }return result;  // 圈复杂度过高,难以理解和测试}// ✅ 正确示例:拆分为多个简单函数// 辅助函数1:处理类型1staticintprocess_type1(int value, int mode, int flag) {if (value <= 0) {return0;    }if (mode == 1) {return (flag == 1) ? value * 2 : value * 3;    } else {return (flag == 1) ? value + 10 : value + 20;    }}// 辅助函数2:处理类型2staticintprocess_type2(int value, int mode, int flag) {// 简化后的逻辑...return value;}// 主函数:简单分发intsimple_function(int type, int value, int mode, int flag) {switch (type) {case1:return process_type1(value, mode, flag);case2:return process_type2(value, mode, flag);default:return0;    }}

圈复杂度计算

// 圈复杂度 = 决策点数量 + 1// 决策点:if, while, for, case, &&, ||, ?: 等intexample(int a, int b, int c) {if (a > 0) {        // 决策点1if (b > 0) {    // 决策点2return1;        } else {         // 决策点3if (c > 0) { // 决策点4return2;            }        }    }return0;}// 圈复杂度 = 4 + 1 = 5

法则6:使用const保护不可变数据

规则说明:所有不应被修改的数据都应使用const修饰。

原因分析

  • • 类型安全:编译器可以检测到对const数据的意外修改
  • • 可读性:明确表达数据的不可变性
  • • 优化机会:编译器可以对const数据进行优化
  • • 文档作用:const是自文档化的,说明数据不应被修改

代码示例

// ❌ 错误示例:未使用constvoidprocess_string(char *str) {  // 不清楚str是否会被修改// 可能修改str,调用者无法知道    str[0] = 'X';}intcalculate(int *values, int count) {  // values可能被修改int sum = 0;for (int i = 0; i < count; i++) {        sum += values[i];        values[i] = 0;  // 意外修改了输入数据    }return sum;}// ✅ 正确示例:使用const保护voidprocess_string(constchar *str) {  // 明确不会修改str// 编译器会阻止对str的修改// str[0] = 'X';  // 编译错误printf("String: %s\r\n", str);}intcalculate(constint *values, int count) {  // values不会被修改int sum = 0;for (int i = 0; i < count; i++) {        sum += values[i];// values[i] = 0;  // 编译错误    }return sum;}// ✅ 更多const使用场景// 1. 常量定义constint MAX_BUFFER_SIZE = 1024;constfloat PI = 3.14159f;// 2. 字符串字面量constchar *error_message = "Operation failed";// 3. 函数参数(指针指向的数据)voidprint_array(constint *arr, size_t len);// 4. 函数返回值(返回的指针指向const数据)constcharget_error_message(void);// 5. 局部变量(如果不应被修改)voidexample(void) {constint local_const = 100;// local_const = 200;  // 编译错误}// 6. 结构体成员typedefstruct {constchar *name;      // 指向的数据不应被修改int value;config_t;// 7. 指向const的指针(指针本身可以修改,但指向的数据不能)voidexample2(void) {constint *ptr;        // ptr可以指向不同的const intint x = 10;    ptr = &x;              // 可以// *ptr = 20;          // 编译错误}// 8. const指针(指针本身不能修改,但指向的数据可以)voidexample3(void) {int x = 10;int *const ptr = &x;   // ptr不能指向其他地方    *ptr = 20;             // 可以修改指向的数据// ptr = &y;           // 编译错误}

法则7:避免使用魔法数字

规则说明:使用有意义的常量或枚举替代直接使用数字。

原因分析

  • • 可读性:有意义的名称比数字更容易理解
  • • 可维护性:修改值时只需改一处
  • • 减少错误:避免使用错误的数值
  • • 自文档化:代码即文档

代码示例

// ❌ 错误示例:使用魔法数字voidbad_example(void) {if (temperature > 100) {           // 100是什么?        turn_on_fan();    }    delay(5000);                        // 5000是什么单位?if (status == 3) {                  // 3代表什么状态?        process_data();    }    buffer_size = 1024 * 4;            // 为什么是1024*4?}// ✅ 更好的做法:使用枚举typedefenum {    STATUS_READY = 0,    STATUS_BUSY = 1,    STATUS_ERROR = 2,    STATUS_COMPLETE = 3system_status_t;typedefenum {    TEMP_UNIT_CELSIUS = 0,    TEMP_UNIT_FAHRENHEIT = 1temperature_unit_t;voidbetter_example(void) {system_status_t status = STATUS_READY;if (status == STATUS_COMPLETE) {        process_data();    }}

法则8:确保数组边界安全

规则说明:所有数组访问必须进行边界检查。

原因分析

数组越界
缓冲区溢出
数据损坏
安全漏洞
系统崩溃
程序行为异常
代码注入
权限提升
系统不稳定
  • • 缓冲区溢出:越界访问可能覆盖其他内存区域
  • • 安全漏洞:可能被恶意利用进行代码注入
  • • 系统崩溃:访问无效内存导致系统异常
  • • 数据损坏:可能破坏其他变量或数据结构

代码示例

// ❌ 错误示例:未检查数组边界voidbad_example(void) {intarray[10];int index = 20;  // 超出范围array[index] = 100;  // 越界访问,危险!char buffer[100];strcpy(buffer, user_input);  // 如果user_input超过100,溢出!}// ✅ 正确示例:边界检查voidgood_example(void) {#define ARRAY_SIZE 10intarray[ARRAY_SIZE];int index = 20;// 边界检查if (index >= 0 && index < ARRAY_SIZE) {array[index] = 100;    } else {printf("Index out of range: %d\r\n", index);return;    }// 安全的字符串操作char buffer[100];size_t input_len = strlen(user_input);if (input_len < sizeof(buffer)) {strcpy(buffer, user_input);    } else {printf("Input too long\r\n");return;    }}

法则9:避免使用不安全的函数

规则说明:避免使用已知不安全的C标准库函数,使用安全替代方案。

原因分析

不安全函数
问题
安全替代
gets()
无法限制输入长度
fgets()
getline()
strcpy()
不检查目标缓冲区大小
strncpy()
snprintf()strlcpy()
strcat()
不检查目标缓冲区大小
strncat()
snprintf()
sprintf()
不检查目标缓冲区大小
snprintf()
scanf()
容易导致缓冲区溢出
fgets()
 + sscanf()

代码示例

// ❌ 错误示例:使用不安全函数voidbad_example(void) {char buffer[100];char source[200] = "This is a very long string...";strcpy(buffer, source);        // 危险:可能溢出strcat(buffer, " more data");   // 危险:可能溢出sprintf(buffer, "%s", source);  // 危险:可能溢出char input[100];    gets(input);                    // 危险:已被废弃}// ✅ 正确示例:使用安全函数voidgood_example(void) {char buffer[100];char source[200] = "This is a very long string...";// 使用strncpy(注意处理\0)strncpy(buffer, source, sizeof(buffer) - 1);    buffer[sizeof(buffer) - 1] = '\0';// 使用snprintf(推荐)snprintf(buffer, sizeof(buffer), "%s", source);// 安全的字符串连接size_t len = strlen(buffer);if (len < sizeof(buffer) - 1) {snprintf(buffer + len, sizeof(buffer) - len, " more data");    }// 安全的输入char input[100];if (fgets(input, sizeof(input), stdin) != NULL) {// 移除换行符size_t len = strlen(input);if (len > 0 && input[len - 1] == '\n') {            input[len - 1] = '\0';        }    }}

法则10:使用静态分析工具

规则说明:使用静态分析工具自动检测代码问题。

原因分析

  • • 早期发现:在编译阶段发现潜在问题
  • • 一致性:确保团队遵循相同的规范
  • • 效率:自动化检查比人工审查更高效
  • • 全面性:工具可以检查人工容易忽略的问题

推荐工具

工具
类型
特点
PC-lint / FlexeLint
商业
功能强大,支持MISRA C
cppcheck
开源
免费,易于集成
Clang Static Analyzer
开源
LLVM工具链,集成度高
SonarQube
商业/开源
代码质量平台

使用示例

// 示例代码(包含多个问题)#include<stdio.h>#include<stdlib.h>#include<string.h>// 问题1:未初始化变量intuninitialized_example(void) {int value;  // 未初始化return value * 2;}// 问题2:未检查返回值voidunchecked_return(void) {void *ptr = malloc(100);  // 未检查返回值strcpy(ptr, "data");}// 问题3:数组越界voidarray_bounds(void) {int arr[10];    arr[20] = 100;  // 越界访问}// 问题4:内存泄漏voidmemory_leak(void) {void *ptr = malloc(100);// 忘记free(ptr)}// 问题5:使用不安全函数voidunsafe_function(void) {char buffer[100];strcpy(buffer, "very long string that might overflow...");}

静态分析工具配置示例

# cppcheck使用示例cppcheck --enable=all --suppress=missingIncludeSystem \         --addon=misra.py \         --xml --xml-version=2 \         source_code.c 2> report.xml# Clang Static Analyzer使用示例scan-build make# PC-lint配置示例(lint配置文件)# lint_config.lnt-e750    // 抑制特定警告+libdir(./include)

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“星球”加入知识星球,有问必答。


点击“阅读原文”查看知识星球详情,欢迎点分享、收藏、点赞、在看。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 19:41:09 HTTP/2.0 GET : https://f.mffb.com.cn/a/463125.html
  2. 运行时间 : 0.277590s [ 吞吐率:3.60req/s ] 内存消耗:4,786.38kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fedf93d7ae10b2f7e14823b49033acce
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000403s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000693s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002318s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005464s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000608s ]
  6. SELECT * FROM `set` [ RunTime:0.007370s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000704s ]
  8. SELECT * FROM `article` WHERE `id` = 463125 LIMIT 1 [ RunTime:0.006194s ]
  9. UPDATE `article` SET `lasttime` = 1770550869 WHERE `id` = 463125 [ RunTime:0.002705s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.009970s ]
  11. SELECT * FROM `article` WHERE `id` < 463125 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.009195s ]
  12. SELECT * FROM `article` WHERE `id` > 463125 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003361s ]
  13. SELECT * FROM `article` WHERE `id` < 463125 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.039227s ]
  14. SELECT * FROM `article` WHERE `id` < 463125 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.054455s ]
  15. SELECT * FROM `article` WHERE `id` < 463125 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.067263s ]
0.279081s