C++安全编码-第一章

2023-11-09

1、 优先C++特性而不是C特性
std::string/std::string_view char*
std::vector/std::array 原生数组
namespace static
引用/智能指针 普通指针
iostream printf,sacnf
智能指针/new,delete malloc,free
const常量/inline函数/函数模板 宏
2、类型命名大驼峰风格----类、结构体、联合体、类型定义(typedef)、枚举
函数命名大驼峰风格
全局变量、局部变量、函数参数、成员变量小驼峰风格
宏、常量、枚举值、goto 标签 全大写,下划线分割
文件名 大驼峰或者小写加下划线
m_fileName加m_表示成员变量
const int g_connectionIds[10] = {0};数组不是基本类型,这里全局常量加g_即可
static const int MAX_LENGTH = 5;静态常量全大写
3、使用命名空间来限定作用域,防止名字冲突(现代语言,只有C语言没有命名空间这个特性)
函数左大括号放行首,其他左大括号跟随语句放行末
表达式换行操作符放行末
当变量被const修饰,无法跟随变量,也不要跟随类型char * const VERSION = “V100”
声明对应的.h文件用于声明需要对外公开的类与接口
static修饰的变量、常量、函数只能在当前文件中被使用,不会被导出给外部的其他模块使用,C++中推荐namespace来代替,这样里面的成员只能在当前文件中使用(相当于全局变量,直接调用)
4、类的成员变量必须显示初始化:如果类有成员变量,没有定义构造函数,也没有定义默认构造函数,编译器将自动生成一个构造函数(但这个构造函数不会对成员变量初始化,对象处于一种不确定性) 例外:类的成员变量具有默认构造函数,那么可以不需要显示初始化,如:std::string someIdentifier;
推荐构造函数初始化列表初始化
int msgID{0};或者int msgID = 0; C++11
5、如果不需要拷贝、移动函数,必须明确禁止(该类不允许拷贝赋值,移动):
1、如果用户不定义,编译器会默认生成拷贝构造、移动构造函数和拷贝赋值、移动赋值操作符(移动C++11之后才有)
2、拷贝和移动分别成对出现和禁止
禁止的方法:
传统C++:class Foo{
private:
Foo(const Foo&);
Foo& operater=(const Foo&);
};
现代C++:class Foo{
public:
Foo(const Foo&) = delete;
Foo& operater=(const Foo&) = delete;
Foo(Foo&&) = delete; // C++11才有移动语义
Foo& operater=(Foo&&) = delete; // C++11才有移动语义
};
6、禁止虚函数使用缺省参数值
7、函数不超过50行(非空非注释)
内联函数不超过10行(非空非注释)
函数参数不超过5个
函数规模小功能简单
8、函数参数尽量使用引用取代指针,推荐string代替char
,array代替内置数组
9、不允许魔鬼数字:type = 12,status = 0;就是魔鬼数字;month = year12,这里12就不是
const int ZERO = 0是魔鬼常量, const int XX_TIMER_INTERVAL_300MS = 300;常量名字限制了取值
10、变量需要使用时才声明并初始化
11、尽量避免使用宏,因为它是 简单文本替换,没有类型检查,没有作用域,在预处理阶段完成,运行报错时直接报相应的值,跟踪调试也是显示值
优先使用内联函数和模板函数替换宏函数
const char * const STRING = “ABC”;当声明在头文件中时,指针本身也必须是const,避免符号冲突
可以保留使用的场景:#和##进行标志符的拼接;用到了关联代码位置的预定义值,如:FILE, LINE
12、一组相关的整形常量(如星期一到七)应该定义为枚举(当枚举值重复时,应用已定义的枚举来修饰)
13、禁止memcpy_s、memset_s初始化 非POD(Plain Old Data,int,char,指针,聚合类型)对象,如用户定义的构造、赋值、析构函数,基类,虚函数
14、为了更好的阅读要求,常量写在运算符的右边
15、避免类型转换(C++类型的类型转换有四种,),避免void
类型
short samll = 0;
long big = small;小转大,自动转换

	dynamic_cast:用于将父类转化为子类,避免做下行转换,其他转换可以用
	Derived derived;
	Base* base = &derived;上行转换,是自动转换
	Derived* local = dynamic_cast<Derived*>(base);下行转换,反映出设计问题

	static_cast:用于基本类型的强制转换,或者void*到其他指针类型的转换
	char tiny = static_cast<char>(big);大转小,强制转换
	const char* immutable = &tiny;非常量转常量指针,自动转换
	void* nakedPtr = local;一个指针自动转换void*,无需强制
	Unknown* unknown = static_cast<Unknown*>(nakedPtr);void*转换为其他类型,避免
	
	reinterpret_cast:用于转换不相关的类型,不安全,少用
	const_cast:移除对象的const属性,使得对象可修改,会破坏数据的不变性,少用(只应在对接外部接口时使用)
	char* canchange = const_cast<char*>(immutable);
	char* buffer = reinterpret_cast<char*>(base);一个类型解释为另一个不想关的类型,危险操作

16、指针和引用类型的形参,不需要修改的,应该使用const;
对于不会修改成员变量的成员函数,也应该使用const修饰;
对于初始化不会再修改的成员变量也应定义为const;

17、安全编码目标:完整性(确保数据是完整的、未被篡改的),机密性(确保数据不被非法访问与窃取),可用性(要求保护资源在需要时可访问)
攻击者意识:程序所处理的所有外部数据都是不可信的攻击数据;攻击者视图监听、篡改、破坏程序运行环境、外部数据
基于攻击者意识前提得到安全编码基本思想:程序在处理外部数据时必须经过严格合法性校验、尽量减少代码的攻击面、通过防御性编码策略来弥补潜在的编码人员的疏忽
17、指针、资源描述符(int fd = open())、布尔变量操作:引用未初始化变量、内存释放后使用、重复释放内存、对指针类型使用sizeof运算
18、断言操作:断言必须使用宏定义、不能直接使用系统的assert(),断言只能用于调试版本,断言不能检查运行时错误,断言不能改变运行环境
19、传递数组时,必须传递其长度;
不对内容进行修改的指针型参数,定义为const
谨慎使用不可重入函数
检查入参的空指针

20、仅使用C++语言本身抛出的异常、代码中不要主动抛出异常
21、构造函数和析构函数必须同时存在、构造函数内不能做任何有可能失败的操作、如果类的公共接口中返回类的私有数据地址,必须加const类型
22、字符串操作常见问题:字符串复制(没有考虑到dest缓冲区的大小是否能容纳source缓冲区,导致复制的时候将dest以外的的内容进行非法覆盖)、字符串连接(没有考虑到连接后的字符串是否超出缓冲区的限制,导致缓冲区被非法覆盖)、字符指针的重叠操作(若两个指针指向的字符串内存空间存在重叠,会导致未定义的行为,且这种行为可能破坏数据的完整性)
带来的风险:由于字符串缓冲区被破坏,导致程序崩溃,若攻击者恶意输入,造成“拒绝服务让正常用户无法使用”;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
23、格式化函数的常见问题:参数类型的不匹配(使程序异常终止,拒绝服务),参数数目不匹配,格式化字符串的长度没有限制并且格式化字符串部分由用户输入(sprintf(szBuffer,“%s”,userinput))–可以由攻击者控制,输入的恶意数据会被当做指令执行
在这里插入图片描述
在这里插入图片描述
24、正确使用安全函数:正确设置安全函数中的destMax值,恰当处理安全函数的返回值
不能重定义安全函数(以宏的方式修改安全函数在代码中的名字,降低了代码的可读性,引发误用操作)
不能以函数封装的方式调用安全函数,降低了代码可读性,引发误用风险
不能对destMax参数使用立即数(在代码中没有准确意义,无法关联到变量的定义,无法关联到缓冲区的长度,也不容易维护)
在这里插入图片描述
在这里插入图片描述
不能对destMax使用源的长度,安全函数对目的缓冲区的保护功能失效,
在这里插入图片描述
在这里插入图片描述
destMax为struct结构体的局部变量时,必须设置为sizeof(变量名)或者sizeof(结构体名)
在这里插入图片描述
destbuff为变长struct结构中的变长成员变量时,destMax必须设置为该成员变量的实际大小,结构体中必须有描述变长部分长度的成员变量
在这里插入图片描述
对dest的局部范围进行操作,dest必须设为destbuff操作范围的内存大小
在这里插入图片描述
对固定长度的全局数组变量,结构体变量进行初始化时,可以不用检查安全函数的返回值
在这里插入图片描述
对函数入参中的内存缓冲区进行初始化,使用了内存中传递的长度进行初始化,如果指针不为空,可以不检查初始化安全函数返回值
在这里插入图片描述
对同一函数内堆上分配的内存缓冲区初始化,使用了分配内存的大小进行初始化,如果指针不为空,可以不检查初始化安全函数的返回值;
根据源内存的大小进行同等大小的内存复制,同一个长度拷贝,不需要检查返回值
在这里插入图片描述
对字符串常量的拷贝与拼接,编码时仔细检查目标内存是否有足够的存储空间,可以不检查安全函数返回值
在这里插入图片描述
25、整数操作不当的几种场景:
有符号整数运算操作出现溢出(溢出攻击(符号位常常在整数表示的最高位上,会算入数值内):执行任意代码):若算数运算的计算结果太大而无法在系统位宽度范围内存储时导致整数溢出;当操作数都是有符号时,溢出就有可能发生,而且溢出的结果未定义,当一个运算的结果发生溢出时,所有关于结果如何的假设均不可靠;当整数太大,进位的信息覆盖掉了符号位的信息,就会产生溢出
在这里插入图片描述

无符号整数反转(也叫回绕):无符号操作数的计算不会溢出,因为结果不能被无符号类型表示的时候,就会对比结果类型能表示的最大值加一再执行求模操作。

在这里插入图片描述

整型转换出现截断错误
有符号整数使用位操作符运算
带来的风险:
内存分配出错:用户输入在与有符号的值和无符号的值之间的隐式转换进行交互时会产生一些错误,而这些错误会导致内存分配函数出现问题;
执行任意代码:整数溢出错误,可导致内存破坏,并可能被用于执行任意代码
我们知道short和char在进行运算的时候会自动提升到整型int

整型表达式赋值给较大类型前未转换为较大类型,造成数据溢出

在这里插入图片描述
对有符号位进行位操作导致数据反转
在这里插入图片描述
正确使用指针的整数类型
在这里插入图片描述
26、危险的堆操作:
内存拷贝时未判断目标内存长度的有效性(目标内存过小)
内存申请完毕后未判断空指针(空指针引用)
使用已经释放的内存
调用不匹配的内存管理操作(new,delete与malloc,free混用)
重复释放内存(double free)
堆管理不当带来的风险:
拒绝服务攻击:由于堆被破坏,可导致程序崩溃;如果被攻击者通过恶意输入控制这种情况,攻击者可以使程序崩溃从而让合法用户无法继续使用。
执行任意代码:攻击者输入的恶意数据被当做指令执行

	堆溢出原理:malloc(10)--此时内存并未初始化,只是分配了内存,申请10字节内存,先申请内存头(包含前向指针和后向指针,共8个字节),其次申请内存体(按照4字节对齐)需申请12字节,一共20字节
	不能引用未初始化的内存

在这里插入图片描述
不能访问已经释放的内存
在这里插入图片描述
堆内存:在这里插入图片描述

栈内存:在这里插入图片描述
需要校验申请内存大小的整数值
在这里插入图片描述
总结:使用0字节长度去申请内存的行为是没有定义的;
大于内存长度最大值,可能导致申请失败,造成拒绝服务;
负数申请内存,会被当成一个很大的无符号数,从而申请失败,造成拒绝服务
小心不要引用空指针:
在这里插入图片描述
禁止alloca函数申请内存,POSIX和C99均未定义alloca的行为,在不支持的平台上运行会有未定义的后果,且该函数在栈帧申请内存,申请的大小可能越过栈的边界而无法预知
在这里插入图片描述
指针释放后必须置为NULL,否则悬挂指针可能会导致双重释放以及访问已释放内存的危险,消除悬挂指针的方法就是使用完后将其置为NULL或者指向另一个合法对象

不可以使用realloc函数调整内存的大小:
void* realloc(void* ptr, size_t size)
1、当ptr与size均不为NULL时,函数会重新调整内存大小,返回新的内存指针,并保证最小的size内容不变
2、ptr为NULL,但是size不为0,等同于malloc(size);
3、size为0,等同于free(ptr);

system函数使用不当导致命令注入
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
system函数可以由win32 API中的CreatProcess()函数或POSIX的exec系列函数代替,或者使用硬编码的函数入参或对外部输入中的命令分隔符进行过滤转义

多线程下不能使用线程不安全函数(strtok–使用了静态分配的空间存储被分割的字符串的位置,但是strtok_r是线程安全的,r的意思是reentrant,可重入的;

printf、cout混用,信号处理函数中使用异步不安全函数:IO函数、自定义的异步不安全函数),
两者的缓冲机制不同(printf无缓冲区,cout有缓冲区),而且对于标准输出的加锁时机也略有不同;
printf:在对标准输出做 任何处理 前先加锁;
cout:在实际向标准输出 打印 时才加锁;
二者存在微弱的时序差别,混用会带来不可预知的错误(如打印输出结果不符合预期,严重导致缓冲区溢出,导致crash)
在这里插入图片描述
在这里插入图片描述

危害:拒绝服务(当程序运行在多线程环境,往往会导致变量被多处修改,从而导致程序运行不正常,甚至crash),执行任意代码(变量被其他线程修改,若被攻击者写入恶意数据。可能导致任意代码执行)

信号处理程序中只能调用异步安全函数,只有C标准库中的abort()、_Exit()、quick_exit()和signal()函数可以在信号处理程序中安全的调用;
信号处理程序中不要调用IO函数

不安全函数:strcpy、strcat等缺乏严格的入参校验和错误处理机制,很容易导致缓冲区溢出等安全问题,这些就是危险函数
27、文件操作问题:
文件操作返回值判断有误;
文件创建时没有指定合适的文件权限;
文件的路径校验不完全
操作不当带来的风险:
重要文件丢失:如文件指针偏移错误,出现相对文件头的负偏移
关键文件被不预期的访问者查看甚至执行:
TOCTOU(time of check time of use)条件竞争漏洞:检查文件到使用文件的这段间隙,可以发动一次扩大权限的攻击,以文件句柄(不能用文件名)作为依据,可以保证文件不被替换
在这里插入图片描述
因为文件名和真实文件本身实际上是一个松绑定的关系,文件名并不包含真实文件的具体信息,多次使用相同文件名试图对同一文件进行操作是不可靠的,存在文件本身被外部手段替换掉而程序并不感知的可能

输入的文件路径必须进行标准化(即转换成绝对路径),确保打开文件是符合预期的,若必须使用相对路径(对应用安装目录不确定),需要对文件名中的特殊字符进行过滤,如“.”和“/”
在这里插入图片描述在这里插入图片描述
内部文件名最好能硬编码参数到应用程序中,如果出于更高的安全要求,需要对文件的完整性进行校验

28、常见随机数安全用途(随机数的随机性不够好,易于预测,容易导致安全机制失效)
SessionID的生成
挑战认证算法中随机数的生成
验证码的随机数生成
生成重要随机文件(存有系统信息的文件)的随机文件名
用于密码算法用途(生成IV、密钥、盐值)的随机数生成
伪随机数:rand(产生的随机序列存在较短的循环周期,产生的随机数是可预测的)
在这里插入图片描述
真随机数推荐方法:
在这里插入图片描述
敏感信息(SessionID、明文口令、密钥)使用完毕后不及时清理。可能通过读取缓存,内存映像等方式被非法获取并利用,造成资产损失

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++安全编码-第一章 的相关文章

  • 强化学习的几种环境介绍

    前言 对于强化学习相关的几种环境介绍 主要包括Mini world Gym maze Grid world gym minigrid Mini world https github com maximecb gym miniworld Mi
  • 用c语言设计加减乘除自动出题程序,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    include include stdlib h define N 10 void fun int a b t char c scanf d a scanf c c scanf d b if c c c c c if c t a b if
  • 关于unique case和priority case语法

    SystemVerilog对于case casez casex语句新增了两个特殊的修饰符 unique及priority 其语法规则如下 unique case
  • 疫情信息获取。

    爬取目标 腾讯新闻 疫情数据 确定信息 在目标网页按F12 在全局数据中寻找 发现有目标数据 接下来在Network中寻找数据并在Headers中获得链接地址 也可以点击搜索查找 较为方便 省份数据和全球数据也是同样的方法 注意图二 最终确
  • 【JS逆向】之webpack逆向实战

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵权 请告知删除 谢谢 目标网站 aHR0cHM6Ly8xNTE0NjQ2LmNvbS9sb2dpbg 引言 webpack对于有研究过人的来说就是 难度并不是很高 但是因为web
  • xss过滤绕过方法总结

    xss注入常用语句 1 2 img src 3 img src 4
  • JS 将数组写入表单

    将数据写入表单 var rowData 1 2 3 function insertToForm rowData if rowData length lt 1 alert 没有数据 else var form formID for var i
  • C++中的类模板定义及实例化

    转载自Out man 文章目录 一 类模板定义及实例化 定义一个类模板 类模板实例化 二 类模板的成员函数 一 类模板定义及实例化 定义一个类模板 template
  • 关于C/C++运算符优先级问题探讨

    最近在知乎上看到一个c c 运算符连写的问题 引发了诸多网友的讨论 具体内容如下图 乍一看 这句代码很长 确实有些让人糊涂 尤其是学习过python的同学 对此写法不太理解 今天我们一起来说一说 优先级 在c语言的表达式中 如果存在多个运算
  • 第1章-爬虫简介(http请求)

    第1章 爬虫简介 一 通讯协议 二 网络模型 三 Http请求与响应 3 1 Http通信 3 2 Http请求 3 3 Http请求方法 四 几个概念 4 1 GET和POST 4 2 URL组成部分 4 3 User Agent 户代理
  • 基于Linux环境的PPPOE服务器搭建

    转载 https www imooc com article 50559 VMware ubuntu虚拟机上搭建PPPOE服务器 https blog csdn net rheostat article details 8069778
  • 随手记怎么样靠谱吗?随手记平台不触碰用户资金

    随着经济的快速发展和人们理财意识的增强 互联网理财在人们的日常生活中逐步普及 而随手记作为随手集团旗下集手机记账 财务规划 金融服务 社区投资者教育等功能于一体的个人财务管理和金融服务品牌 其推出的理财产品受到不少理财投资者的青睐 但是 随
  • 什么是渲染目标(render target)&& 渲染到纹理(Render To Texture, RTT)详解

    渲染到纹理 Render To Texture RTT 详解 RTT是现在很多特效里面都会用到的一项很基本的技术 实现起来很简单 也很重要 但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿 不知道是因为太简单还是因为这项技术已经出现
  • docker安装觅思文档(mrdoc)

    mrdoc文档地址 https mrdoc fun doc 18 mrdoc项目地址 GitHub zmister2016 MrDoc mrdoc online document system developed based on pyth
  • STM32逆变器控制

    ADC引脚分配 直流电压 Vc1 PA0 Vc2 PA1 电网电压 U1 V1 W1 AD7323 PB3 PB4 PB5 逆变器输出电压 UCA UCB UCC AD7323 PB13 PB14 PB15 电容电流采样 ICa ICb I
  • Mybatis解释及Mybatis项目搭建

    一 什么是Mybatis MyBatis是一个持久层框架 属于JDBC的替代方案之一 他的前身是iBatis 它属于ORM关系型映射 ORM O R Mapping 对象关系映射 是一种把内存中的对象保存到关系型数据库的技术 用它封装数据库
  • jmeter报错:jmeter java.net.SocketException: Connection reset

    jmeter java net SocketException Connection reset 网络慢 导致
  • HBuilder mui登录和访问控制教程

    HBuilder mui登录和访问控制教程 mui中提供了登录的模板页 但是对于登录后各个页面的访问控制 刷新等并没有官方的推荐方案 我在这里简单说一种初级的解决方案吧 肯定有不足指出 欢迎批评指正 第一节中创建移动APP项目的时候选择的是
  • micropython 通过spi驱动LCD显示屏

    我呢一直对电路设计和程序设计有非常大的爱好 不好说有多精通 纯属个人弄着玩的 所以后面有时间可以和大家一起来交流一下 另外最近也接触了一些PCB 所以一些开发板之类的都自己设计制作了 今天讲的是通过micropython来驱动LCD显示 用
  • 解决数据库死锁现象

    解决数据库死锁现象 一 日志情况 日志情况如下 信息 At least one JAR was scanned for TLDs yet contained no TLDs Enable debug logging for this log

随机推荐

  • JS函数 ,变量

    6函数 6 1函数的概念 大事化小 将复杂的问题简单化 如何大事化小呢 通过函数 为什么需要有函数 首先看一下输出100以内所有素数的解决方案 方案一 循环嵌套 var n Number prompt 请输入一个自然数 var m Math
  • Microsoft Office 2016(ProPlus/Visio/Project) VOL 简体中文版

    Office 2016 专业增强版32 位 文件名 SW DVD5 Office Professional Plus 2016 W32 ChnSimp MLF X20 41351 ISO SHA1 0218F50774AAB63AF7755
  • node中Express的use深入理解

    Express的API 现在学node 不来点Express 都不好意思给人打招呼 但是 我刚接触的时候 觉得好多API 感觉乱糟糟的 没办法 大脑容量不够 不过有一样东西叫地铁 在上面可以让人想清楚很多事情 先来一段最简单的node版he
  • 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    原文见 Understanding TCP Sequence and Acknowledgment Numbers PacketLife net 如果你正在读这篇文章 很可能你对TCP 非著名 的 三次握手 或者说 SYN SYN ACK
  • 系列:4.4、Kubernetes 存储

    Kubernetes 存储 Kubernetes storage存储的相关选项 1 Kubernetes Volumes 由于 Pod 是短暂的 我们有时要求 Pod 上的数据可用于下一个计划的 Pod 或者 有时容器应该在 Pod 中共享
  • 为什么c++输出char类型变量的地址出现的是乱码?

    char a h cout lt lt a 就会出现乱码 h烫烫烫烫篾 看了这个贴 https bbs csdn net topics 310062432 改成printf p a 或者std cout lt lt void a 就可以输出
  • Frida—HOOK 学习笔记2

    Android部分 基础知识 1 安卓分层 简单提一下安卓分层 这个点知道了更好 不知道也无所谓 毕竟我们不是开发 只是为了避免下述情况 我要学习so文件HOOK 一波百度 HOOK so层 之后 出现了一个 native 点进去一看 其内
  • Redis学习笔记(七):底层数据结构和对象

    第一章 数据结构与对象 一 简单动态字符串 SDS 在Redis中默认字符串的表示使用了简单动态字符串 Simple Dynamic String 而没有使用C语言中的传统字符串 字面量 string literal 字面量只用来表示一些无
  • 【RabbitMQ教程】- 实现延时队列

    目录 RabbitMQ实现延时队列 Maven依赖 代码实现 1 插件方式 RabbitMQ实现延时队列 RabbitMQ实现延时队列有两种方式 1 死信队列 2 下载插件 Maven依赖 Maven依赖
  • 力扣(LeetCode)每日一题 1921. 消灭怪物的最大数量

    只需要三个步骤 1 初始化 2 排序 3 遍历 class Solution public int eliminateMaximum int dist int speed 初始化 每个怪物到达城市所需要的回合数目 int times new
  • QEMU-运行一个字符驱动(3)

    上面是我的微信和QQ群 欢迎新朋友的加入 上代码 chardriver c include
  • Web 组件代码示例

    在本文中 我提供了对 Web 组件是什么以及如何使用它们的基本理解 使用现实生活中的示例 我将展示 Web 组件如何帮助使应用程序更可预测和更易于维护 此外 我分享了有关如何通过将 HTML CSS JS 代码隔离为 等待它 隔离的组件以供
  • 二叉查找树 数组实现 ArrayBinarySearchTree

    数组实现的二叉查找树 适用查找操作频繁 插入 删除操作较少的情况 代码 using System namespace DataStructure 数组实现的二叉查找树 输入一个数组 获得一颗二叉查找树 找parent 和 child ind
  • 华为OD机试 - 文件目录大小(Java & JS & Python)

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • c++ 实现信号和槽机制

    主要通过 c 实现类型QT 信号和槽的问题 设计思路 1 利于模板函数和模板类的 通用性 2 BInd的时候 讲槽函数指针保存 触发时调用 代码如下 include
  • 用python函数写斐波那契数列的函数_python—函数进阶-斐波那契数列

    上次说到生成器的调用next 这样很不方便 需要手动调 我们一般是循环着调 while for都可以 a i for i in range 5 for i in a print i 0 1 2 3 4 执行结果 和手动调的区别是没了的话就会
  • [高级数据结构C++] 线段树(区间和的查询与修改)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • vue-quill-editor 富文本编辑器上传图片自base64改为上传到服务器

    就是要一个富文本编辑器 然后有图片上传功能 因为vue quill editor是将图片转为base64编码 所以当图片比较大时 提交后台时参数过长 导致提交失败 vue quill editor引入过程略 我其它文章里面有 废话不多说 上
  • 实战搞定gRPC之移植篇

    一 交叉编译protobuf 1 配置交叉编译器 export PATH PATH opt EC20 crosstool ql ol crosstool sysroots x86 64 oesdk linux usr bin opt EC2
  • C++安全编码-第一章

    1 优先C 特性而不是C特性 std string std string view char std vector std array 原生数组 namespace static 引用 智能指针 普通指针 iostream printf s