面向安全的健壮可靠的C++编程

2024-04-21 09:08

本文主要是介绍面向安全的健壮可靠的C++编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

十X年前,林锐博士的一文《高质量C\C++编程指南》,加上房鸣老师的高级C++编程,成为校园招聘中我的笔试利器。

软件的发展,对代码提出了更高的要求:安全性、可靠性、健壮性

C/C++语言,成也内存,败也内存。

内存错误是每个程序员的噩梦。编译器管词法分析、语法分析,但管不了多种内存错误。多数情况是,发生了莫名其妙的问题,有时有有时无, 不是每次必现,not reproducable!如果每次都能重复出现的错误,好解决。就怕概率游戏——有时用户怒发冲冠,气冲冲地把你找来,程序却运行好好的,没有发生任何问题,你刚一走,软件又抽筋了,错误发作。客户抱怨你的产品质量差投诉你给差评,你抱怨客户姿势不对使用不当能力需要加强。

其实多数内存问题,养成良好的编码习惯,借用一些扫描工具,在commit代码,push前就能解决。

先说常见的。

不管内存分配是否成功,直接使用它。

新手常常会有这样的错觉,内存分配肯定是OK的。何况是调用标准库函数。

这种假定有风险。一旦内存分配失败,函数返回值错误,程序就发生异常,不按照设计逻辑走了。

先来举个例子,再给个list。

我们常用的内存分配函数malloc( ),memory allocation,中文叫动态内存分配。它的定义如下:

void *malloc(size_t size);

void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型)。

如果内存分配成功,则返回指向被分配内存的指针(此存储区中的初始值不确定)。否则返回空指针NULL。例如当内存空间不足,分配的内存又很大时,就会分配失败,返回NULL。就像银行卡里余额只有两位数,还是小数点后,却想取出上百张百元大钞。

不推荐的写法:

malloc(n + 1);

推荐写法,处理标准库函数返回null的情况:

buf = (char *)malloc(n + 1);if (NULL == buf) {/* Handle malloc() error */strcpy(buffer, "unknown error");goto write_log;}else{......}

此类的标准库函数很多,既需要处理正确的返回值(基本不会忘),还要处理错误的返回值(高手的高明之处)。

详见CERT之ERR33-C

这篇关于面向安全的健壮可靠的C++编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922687

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<