VS2019安全函數scanf_s問題

VS2017、VS2019等安全函數scanf_s問題:

scanf()、gets()、fgets()、strcpy()、strcat() 等都是C語言自帶的函數,它們都是標準函數,但是它們都有一個缺陷,就是不安全,可能會導致數組溢出或者緩沖區溢出,讓黑客有可乘之機,從而發起“緩沖區溢出”攻擊。

scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微軟自己發明的安全函數,它們僅適用于 VS,在其它編譯器下無效。這些安全函數在讀取或操作字符串時要求指明長度,這樣一來,過多的字符就會被過濾掉,避免了數組或者緩沖區溢出。

比如scanf()與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() 顯然更加安全。

但是,安全函數不利于大家學習,它們不但使用麻煩,而且也不被絕大多數教程采用。另外,安全函數是微軟自己發明的,只適用于 VS 編譯器,在其他編譯器下無效。

取消強制使用安全函數:
我們通過對 VS 做適當的設置,讓它不再強制使用安全函數,從而可以使用 scanf()、gets()、fgets()、strcpy()、strcat() 等C語言的標準函數去編程。

VS 之所以會提示使用安全函數,是因為它進行了SDL檢查(安全性開發生命周期檢查),只要將它取消就可以了。

菜單欄中選擇 “項目 --> xxx屬性”(或者直接按下組合鍵“Alt+F7”),
選擇“C/C++ --> SDL檢查”,將“是”改為“否”,重新運行就行了。
摘自:http://c.biancheng.net/view/473.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

eclipse啟動tomcat, http://localhost:8080無法訪問的解決方案

問題:: tomcat在eclipse里面能正常啟動,但在瀏覽器中訪問http://localhost:8080/不能訪問tomcat管理頁面,且報404錯誤。同時其他項目頁面也不能訪問。訪問的時候出現下列頁面: 現在關閉eclipse里面的tomcat,在tomcat安裝目錄下雙擊…

GWT EJB3 Maven JBoss 5.1集成教程

大家好, 在本文中,我們將演示如何正確集成GWT和EJB3 ,以實現示例項目,使用maven進行構建并將其部署在JBoss 5.1應用服務器上。 實際上,您可以輕松地更改maven構建文件中的依賴關系,并將項目部署到您喜歡的…

VS2019注釋整段代碼

VS2019注釋整段代碼 1.注釋 先CTRLK,然后CTRLC 2.取消注釋: 先CTRLK,然后CTRLU 順便寫一下: VS code注釋整段代碼 Alt Shift A 注釋 CodeBlocks: CtrlShiftC注釋掉當前行或選中部分, CtrlShiftX解除注釋…

linux中的開機和關機命令

與關機、重新啟動相關的命令 * 將數據同步寫入硬盤中的命令 sync * 慣用的關機命令 shutdown * 重新啟動、關機 reboot halt poweroff sync 強制將內存中的數據寫入到硬盤當中。因為linux系統中,數據會緩存在內存當中,所以為了保證數據完整保存在硬盤…

如何在不到1ms的延遲內完成100K TPS

馬丁湯普森(Martin Thompson)和邁克爾巴克(Michael Barker)討論了通過采用一種新的基礎架構和軟件方法來構建HPC金融系統,以不到1ms的延遲處理超過100K TPS的問題。 一些技巧包括: 了解平臺 建模領域 明…

獲取時間C語言-按秒數

兩部分&#xff1a; 1.獲取秒數 2.獲取“年-月-日-時-分-秒” 1.獲取秒數 #include<time.h>//包含的頭文件int GetTime() {time_t t;t time(NULL);//另一種寫法是//time(t);//當time&#xff08;&#xff09;內參數為空時結果直接輸出&#xff0c;否則就會存儲在參數…

Spring的69個知識點

目錄 Spring 概述依賴注入Spring beansSpring注解Spring數據訪問Spring面向切面編程&#xff08;AOP&#xff09;Spring MVCSpring 概述 1. 什么是spring? Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用&#xff0c;但是有些擴展是針對構建J2EE平臺的…

python 編碼問題之終極解決

結合之前遇到的坑以及下面貼的這篇文章&#xff0c; 總結幾種python亂碼解決方案&#xff0c;如果遇到亂碼&#xff0c;不妨嘗試一下&#xff1f; 1&#xff0c;必備 #encodingutf-8 2, python編程環境編碼 import sys reload(sys) sys.setdefaultencoding(utf8) 3,不知道神馬…

GWT 2 Spring 3 JPA 2 Hibernate 3.5教程

本分步指南將介紹如何使用開發一個簡單的Web應用程序 Google的網絡工具包 &#xff08;GWT&#xff09;用于富客戶端&#xff0c;而Spring作為后端服務器端框架。 該示例Web應用程序將提供對數據庫執行CRUD&#xff08;創建檢索更新刪除&#xff09;操作的功能。 對于數據訪問層…

洛谷P1014 [NOIP1999 普及組] Cantor 表

現代數學的著名證明之一是 Georg Cantor 證明了有理數是可枚舉的。他是用下面這一張表來證明這一命題的&#xff1a; 代碼 import java.util.*; public class Main{public static void main(String[] args){//int x1 0;int i 0;Scanner sc new Scanner(System.in);int n s…

3522: [Poi2014]Hotel( 樹形dp )

枚舉中點x( 即選出的三個點 a , b , c 滿足 dist( x , a ) dist( x , b ) dist( x , c ) ) , 然后以 x 為 root 做 dfs , 顯然兩個位于 x 的同一顆子樹內的點是不可能被同時選到的 . 我們對 x 的每一顆子樹進行 dfs , 記錄下當前子樹中的點到 x 距離為 d ( 1 < d < n )…

第一沖刺階段工作總結02

1.昨天&#xff1a; 實驗簡單的安卓程序&#xff0c;開始具體的設計軟件界面。 2.今天&#xff1a; 繼續設計軟件頁面&#xff0c;由于安卓虛擬機過于遲緩&#xff0c;配置真機&#xff0c;學習如何在真機上運行程序。 3.遇到的困難&#xff1a; 真機配置不知道怎樣配置&#x…

JBoss 4.2.x Spring 3 JPA Hibernate教程第2部分

我們將繼續有關Spring 3 &#xff0c; Hibernate &#xff0c; JPA和JBoss 4.2.x – 4.3集成的教程 。 最后一步是創建一個Spring服務&#xff0c;以向最終用戶公開功能。 我們必須創建一個接口類和相關的實現類。 首先是接口類&#xff1a; package com.mycomp.myproject.se…

洛谷P1035 [NOIP2002 普及組] 級數求和

代碼 import java.util.Scanner;public class Main {public static void main(String args[]){Scanner sc new Scanner(System.in);int k sc.nextInt();int n 0;double Sn 0;while(Sn<k){n;Sn Sn 1.0/n;}System.out.println(n);} }這樣寫while循環體這需要每次加上1/…

『Luogu OJ』『C++』Level 1-1

關卡1-1&#xff0c;3道題 洛谷的第一個任務 任務說明&#xff1a;勇敢的邁出第一步&#xff0c;了解下語言和洛谷。跟著書本和老師走&#xff0c;不會難的。 要完成這個任務&#xff0c;請將以下的題目都AC掉&#xff08;即通過這道題目&#xff09;&#xff1a; 1.AB Problem…

Java中的Google ClientLogin實用程序

Google API的身份驗證和授權是當今需要與Google服務集成和信息交換的應用程序中的常見功能。 盡管大多數Google身份驗證過程是針對Web應用程序量身定制的&#xff0c;但它也可用于桌面和已安裝的應用程序。 對于桌面應用程序&#xff0c;Google建議使用稱為ClientLogin的身份驗…

九度OJ1486 /POJ 1029/2012北京大學研究生復試上機

wa到死&#xff01;wa到死&#xff01;這是一個看著簡單&#xff0c;坑及其多的題&#xff01; 坑一&#xff1a;POJ上是單組輸入&#xff0c;九度上是多組輸入&#xff0c;媽蛋要是研究生復試遇到這種大坑肯定死掉啊&#xff01;而且對于codeforces比較習慣的 同學肯定會覺得巨…

P1046 [NOIP2005 普及組] 陶陶摘蘋果

題目描述 陶陶家的院子里有一棵蘋果樹&#xff0c;每到秋天樹上就會結出 1010 個蘋果。蘋果成熟的時候&#xff0c;陶陶就會跑去摘蘋果。陶陶有個 3030 厘米高的板凳&#xff0c;當她不能直接用手摘到蘋果的時候&#xff0c;就會踩到板凳上再試試。 現在已知 1010 個蘋果到地面…

新手不了解Xcode和mac系統可能犯得錯誤和我的建議

我是學iOS剛入門的新手&#xff0c;本人裝的時黑蘋果&#xff0c;我是喜歡完美的人&#xff0c;但黑蘋果又是不完美的系統&#xff0c;比如關不了機啊&#xff0c;和顯卡驅動不了啊&#xff0c;當自己的電腦出現白屏和卡頓的時候氣的沒脾氣。我是一個新手。開始學的時java但我喜…

改善Java應用程序性能的快速技巧

曾經遇到過性能問題嗎&#xff1f; 我也是。 如果我的經理再喊一次“ faaaaster”&#xff0c;我一生都會有聽力障礙。 順便說一句&#xff0c;我能聽到所有聲音中的德語發音嗎&#xff1f; ;-) 您可以相信仍然有人無知地在談論垃圾收集器&#xff08;得到它嗎&#xff1f;&…