当前位置: 首页 > news >正文

检查输入有效性(指针是否为NULL)和检查字符串长度是否为0

检查输入有效性(指针是否为NULL)和检查字符串长度是否为0

这两个检查针对的是完全不同的边界情况,都是必要的防御性编程措施:

1. 空指针检查 if(!src)

  • 目的:防止解引用空指针
  • 场景:当调用者传入 NULL
  • 风险strlen(NULL) 会导致程序崩溃(段错误)
  • 处理:直接返回错误码 -1
  • 必要性:⭐️⭐️⭐️⭐️⭐️(关键安全措施)

2. 空字符串检查 if(len == 0)

  • 目的:处理长度为0的特殊情况
  • 场景:当传入 ""
  • 风险
    1. src + len - 1 会指向 src[-1](非法内存访问)
    2. while(len--) 会执行 len=-1 次(逻辑错误)
  • 处理:直接打印 “(empty)” 并返回
  • 必要性:⭐️⭐️⭐️⭐️(关键逻辑完整性)

为什么两者都需要?

检查类型输入示例不检查的后果修正后行为
空指针检查test_func(NULL)程序崩溃(段错误)返回 -1
空字符串检查test_func("")非法内存访问(未定义行为)打印 “(empty)”

错误路径演示(无空字符串检查)

// 当 src = "" 时:
int len = 0;  // strlen("")=0
const char* s = src + 0 - 1; // = src - 1(非法内存位置!)while(0-- != 0) { // 先判断0!=0→false,但len变为-1// 循环不会执行
}
// 但s已经指向非法位置

实际应用场景

  1. 用户输入处理

    char input[100];
    fgets(input, sizeof(input), stdin);
    test_func(input); // 用户可能直接按回车(空字符串)
    
  2. 网络数据解析

    char* packet = receive_network_data();
    test_func(packet); // 可能收到空包或无效指针
    
  3. API边界防护

    // 库函数必须处理所有可能的输入
    int public_api(char* str) {return test_func(str);
    }
    

完整安全处理流程

int test_func(char* src) {// 第一层:空指针防护(防止崩溃)if(!src) {log_error("NULL pointer passed");return -1;}// 第二层:获取长度int len = strlen(src);// 第三层:空字符串处理(防止逻辑错误)if(len == 0) {printf("(empty)");return 0; // 合法输入,正常返回}// 第四层:内存分配检查char* dest = malloc(len + 1);if(!dest) {log_error("Memory allocation failed");return -2; // 区分内存错误}// ... 后续操作 ...
}

为什么其他语言不需要?

对比其他语言的处理:

语言空指针处理空字符串处理
C/C++需手动检查需手动检查
Java自动抛NullPointerException可正常处理 “”
Python自动抛TypeError可正常处理 “”
Go自动panic可正常处理 “”

在系统级编程中(特别是C/C++),这种显式检查是必要的,因为:

  1. 没有运行时自动检查
  2. 直接内存访问风险高
  3. 未定义行为可能导致严重漏洞

总结

两个检查缺一不可:

  • if(!src) 保护的是程序的生命周期(防崩溃)
  • if(len==0) 保护的是程序的逻辑正确性(防未定义行为)

这正是C语言编程的核心原则:

“永远不要信任外部输入,用防御性代码处理所有边界情况”

http://www.dtcms.com/a/275367.html

相关文章:

  • 图像扭曲增强处理流程
  • 基于 AI 的大前端网络请求优化:动态调整与缓存策略
  • Nginx模块注册全流程揭秘:为什么Nginx模块化架构依然是Web服务器的“金标准”?
  • stack和queue的使用和模拟实现以及了解deque
  • 以数据为核心,以业务为导向,漫谈数据可视化应用
  • 网络编程员工管理系统
  • 【MogDB】一种基于ctid分片并发查询以提升大表查询性能的方式
  • RBAC权限模型深度解析:从理论到企业级实践
  • 贪心算法题解——跳跃游戏 II【LeetCode】
  • The Black Heart
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • 【极客日常】后端任务动态注入执行策略的一种技术实现
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • .net机器学习框架:ML.NET数据处理
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • 钉钉小程序开发环境配置与前端开发指南
  • 计算机毕业设计ssm基于SSM的萌宠交流平台 基于SSM的毛孩子互动分享与领养系统 SSM架构下的宠物社交·商城·救助一体化平台
  • Mac M芯片安装RocketMQ服务
  • 【Docker基础】Dockerfile指令速览:基础常用指令详解
  • 【STM32实践篇】:最小系统组成
  • 实战指南:用pmap+gdb排查Linux进程内存问题
  • 9.4 自定义SMC服务开发
  • springboot使用@Validated不起作用
  • 加法器学习
  • AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测
  • Java使用Langchai4j接入AI大模型的简单使用(四)--整合Springboot
  • Window/linux获得程序运行目录C++
  • C++ Map 和 Set 详解:从原理到实战应用
  • 基于 Python 的数据分析技术综述
  • 2025 全球酒店用品厂家竞争力排行榜发布:扬州卓韵领衔,布草工厂实力重塑行业格局