C语言编译器(C语言编程软件)完全攻略(第二十七部分:VS安全函数问题(C语言安全函数)是怎么回事?如何解决?)

news2024/9/27 19:22:07

介绍常用C语言编译器的安装、配置和使用。

二十七、VS安全函数问题(C语言安全函数)是怎么回事?如何解决?

在 VS(Visual Studio)下编译C语言程序,如果使用了 scanf()、gets()、strcpy()、strcat() 等与字符串读取或操作有关的函数,有时候VS会报错,提示该函数可能不安全,并且建议替换为带有_s后缀的安全函数,如下图所示:

1、什么是安全函数(safe function)

scanf()、gets()、strcpy()、strcat() 等都是C语言自带的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出或者缓冲区溢出,让黑客有可乘之机,从而发起“缓冲区溢出”攻击。

scanf_s()、gets_s()、strcpy_s()、strcat_s() 是 C11 标准新引入的安全函数,它们在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

下面我们以 scanf_s() 为例来讲解。

scanf() 在读取字符串时不会检查字符个数,它不知道数组或缓冲区到底能容纳多少个字符,例如:

char buf[5]={0};

scanf(“%s”, buf);

当用户输入abcdeABCDE这10个字符时,scanf() 会全部读取,并放入 buf 中,不过 buf 最多只能存储 5 个字符,不足以容纳用户输入的全部数据,所以多出来的 5 个字符就会使用 buf 后面的内存,而 buf 后面的内存可能没有使用权限,或者已经被别的数据占用,这就导致程序在运行时可能会出现不可预知的错误。

最要命的是,这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出来只有一种后果,就是程序被操作系统终止,也就是我们常说的“程序崩溃”。

更改上面的代码,使用 scanf_s() 代替 scanf():

char buf[5] = {0};

scanf_s(“%s”, buf, 5);

scanf_s() 最后一个参数用来指明数组或者缓冲区的大小,假设它的值为 n,那么最多只允许读取 n-1 个字符(因为最后要存储'\0'),多出来的字符就不再读取了,这样就可以避免读入过多的字符。与 scanf() 相比,scanf_s() 显然更加安全。

但是,安全函数不但使用麻烦,而且也不是所有的编译器都支持,也不被绝大多数教程采用,不利于大家学习。

2、如何取消安全函数的限制

我们通过对 VS 做适当的设置,让它不再强制使用安全函数,从而可以使用 scanf()、gets()、fgets()、strcpy()、strcat() 等C语言的标准函数去编程。

VS 之所以会提示使用安全函数,是因为它进行了SDL检查(安全性开发生命周期检查),只要将它取消就可以了。

1) 菜单栏中选择 “项目 --> xxx属性”(xxx为创建的项目名称),或者直接按下组合键“Alt+F7”,如下图所示:

2) 此时会弹出如下图所示的一个对话框,选择“C/C++ --> SDL检查”,将“是”改为“否”,如下图所示:

3)最后点击“确定”按钮,重新运行程序,你会发现程序可以正常运行了。

另外,VS2010、VS2015 等低版本的 VS 可以在创建项目之处就取消 SDL 检查(如下图所示),但是到了 VS2017 时就不行了,创建项目时没有这个选项了,只能在创建项目完成以后再按照以上步骤取消 SDL 检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在IDEA中使用git分支进行开发然后合并到Master分支,2022.1.x版本

在实际开发过程中,为了避免因为在开发中出现的问题以及方便发布版本,如果是多版本发布的情况相下,我们通常需要采用分支进行开发,这个时候,我们就需要了解git分支的相关知识点了,本篇博客也是博主在实际公司…

linux高级管理——Squid代理

一、squid服务基础: 1.1缓存代理的概述: 代理的工作机制 当客户机通过代理来请求Web页面时.指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机:如果缓存中…

JumpServer3.0版本-资产管理

资产列表 资产列表可展示资产树和类型树,可以查看添加的所有资产 新增资产也是在此页面 在资产树上面右键可以创建新的子节点 比如这里我新建了个“腾讯云”节点 选中腾讯云节点,点击中间的“创建”按钮,新增资产 选择你的主机类型,我这是Linux 填写你资产的名称、IP必…

复习sql: 内连接,左外连接,右外连接,全外连接,交叉连接

数据表准备 学生表 和 课程表 内连接 join 或 innner join 筛选出满足条件的列,where也可以实现这种功能。 SELECT * FROM student JOIN course ON student.student_id course.stu_id结果 外连接 左外连接 left join 或者 left outer join 以第一个表为基础&…

爬虫-3-模拟登录,代理ip,json模块

#本文仅供学习使用(O`) 如果服务器响应的数据为json数据: 那么我们可以用 res.json() 或 json模块(将json字符串转换为Python里面的字典类型) 接收数据。

商家如何通过会员充值消费管理系统提升业务运营与用户体验

在当今数字化商业环境中,会员充值消费管理系统已经成为各类商家提高客户粘性、优化服务流程、增强市场竞争力的重要工具。那么如何通过会员充值消费管理系统提升业务运营与用户体验,商家是否有所了解呢?下面就带大家简单了解。 首先&#xf…

计算机网络 综合(习题)

【计算机网络习题】系列文章目录 计算机网络 第一章 绪论(习题) 计算机网络 第二章 计算机网络体系结构(习题) 计算机网络 第三章 应用层(习题) 计算机网络 第四章 运输层(习题) 计算机网络 第五章 网络层(习题) 计算机网络 第六章 数据链路层(习题) 计算机网络 第七章 物…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)添加 删除 修改 释放

在上篇文章(处理任务队列中的任务)中我们讲解了处理任务队列中的任务的具体流程,eventLoopProcessTask函数的作用: 处理队列中的任务,需要遍历链表并根据type进行对应处理,也就是处理dispatcher中的任务。 // 处理任…

Hystrix熔断/断路器

简介 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1)、Docker网络原理 Docker默认使用的网络模型是bridge,这里只讲bridge网络模型 1)容器之间通信原理 当安装完docker之后,docker会在宿主机上创建一个名叫docker0的网桥,默认IP是172.17.0.1…

【DevOps-05】Integrate工具

一、简要说明 持续集成、持续部署的工具很多,其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。 二、Jenk…

Opencv与PyQt5设计一个摄像头界面

一、前言 本篇的内容是学习的这一位博主的:程序界面设计_Doc_Cheng的博客-CSDN博客。 这是我见过很详细的教你如何使用的PyQt5来完成UI界面设计的,专注于UI界面设计。对我而言,这教程就像是一个实用工具,因为我只需要能够显示图…

K8S Prometheus-rocketmq-exporter配置

下载rocketmq-exporter 通过Docker仓库下载 docker pull sawyerlan/rocketmq-exporter:latest 然后打标签,推送到自己的仓库 也可通过代码自己build镜像 git clone GitHub - apache/rocketmq-exporter: Apache RocketMQ Prometheus Exporter 然后打标签&#x…

Java数组:一维数组、二维数组、Arrays

文章目录 1、一维数组1.1 数组概念1.2 数组的声明1.3 数组的静态初始化1.4 数组的动态初始化1.5 地址值1.6 数组元素访问1.7 索引1.8 数组的遍历1.9 数组两种初始化方式的区别 2、二维数组2.1 二维数组的声明2.2 二维数组的静态初始化2.3 二维数组的动态初始化2.4 二维数组的遍…

使用metricbeat 监控多ES集群

背景 ES 本身自带 监控,属于xpack 中的内容,为商业版,需要收费; 并且 monitor 功能必须要在security开启后才能使用,还有就是集群监控自己,将采集到的性能数据保存到本集群,这是一个比较差的设…

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃(二) 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目,其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…

代码随想录算法训练营第二十一天| 回溯 216. 组合总和 III 17. 电话号码的字母组合

216. 组合总和 III 可以参考77.组合中关于选取数组的相关操作。 递归函数的返回值以及参数:一般为void类型 递归函数终止条件:path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,然后当n为0的时候&#xff0…

RabbitMQ高级

文章目录 一.消息可靠性1.生产者消息确认2.消息持久化3.消费者确认4.消费者失败重试 MQ的一些常见问题 1.消息可靠性问题:如何确保发送的消息至少被消费一次 2.延迟消息问题:如何实现消息的延迟投递 3.高可用问题:如何避免单点的MQ故障而导致的不可用问题 4.消息堆积问题:如…

AI教我学编程之C#关键字

AI教我学编程系列学习第三课 — C#关键字 前言重点先知关键字分类保留字上下文关键字 对话AI首遇波澜调整指令第一次第二次第三次直到我提出如下指令 人工智能?阶段总结 知识拓展1、Ecma和ISO是什么?2、System,dllhost.exe,taskmg…

服务器磁盘挂载及格式化

一边学习,一边总结,一边分享! 写在前面 最近一直折腾组装的电脑,来回折腾了很久关于我花费六千多组了台window+Linux主机,目前基本是可以使用了。对于Windows主机配置基本是没问题,一直在使用,以及桌面化软件,都可以自己安装,只是说这台主机有些软件可能一时半会安装…