高效C/C++之九:Coverity修復問題:關于數組操作 和 內存操作

【關注我,后續持續新增專題博文,謝謝!!!】

上一篇我們講了

? ? ? ? 這一篇我們開始講?高效C/C++之九:Coverity修復問題:關于數組操作 和 內存操作

目錄

【關注我,后續持續新增專題博文,謝謝!!!】

一、關于數組操作

? ??2.1:使用沒有初始化的下標變量

? ? 2.2 :下標越界操作

二、:關于內存操作

? ??2.1:申請和釋一一對應

? ? 2.2 :釋放后切勿再訪問,賦nullptr

? ? 2.3 :關于 delete 和 delete [ ]

? ? 2.4 :對象釋放之后再次釋放

? ? 2.5?:c/c++內存分配

?

【關注我,后續持續新增專題博文,謝謝!!!】


一、關于數組操作

? ??2.1:使用沒有初始化的下標變量

使用沒有初始化的下標變量,進行寫入,可能會寫入一些系統內存,導致安全風險。

習慣對變量賦值的用法是,先判斷變量是否是某個初值,然后進行相關操作,將返回值賦給變量。

異常代碼
uint size;
buff[size] = 7;
正確代碼
uint size = 0;
buff[size] = 7;

? ? 2.2 :下標越界操作

數組下標越界,讀寫非法內存,造成內存踩踏,數組下標越界不會被編譯器檢查到,且會在運行時導致程序隨機崩潰。

使用下標之前,需要校驗下標是否在數組長度的范圍內。

異常代碼
char c = buff[offset];
正確代碼
if ((offset >= 0) && (offset < size)) {char c = buffer[offset];
} else {return -1;
}

二、:關于內存操作

? ??2.1:申請和釋一一對應

1:棧空間會隨著生命周期的消失而消失,堆空間則不會,因為申請的內存一定要去釋放;malloc 和 free、new 和 delete、new[]和 delete[] 申請和釋放要一一對應;

? ? 2.2 :釋放后切勿再訪問,賦nullptr

釋放的內存包括調用free()、delete()釋放的堆內存和函數執行完后自行釋放的棧內存,這兩類已釋放內存如果還被訪問,會存在很大風險。

所以我們在釋放后,要給指針變量賦值為nullptr,避免野指針,就算再釋放nullptr,也不會有問題。

? ? 2.3 :關于 delete 和 delete [ ]

一維數組
int *array=new int [m];
delete [] array;
二維數組
int **array
array = new int *[m];
for (int i=0; i<m; i++ ) {array[i] = new int [n]  ;
}for( int i=0; i<m; i++ ) {delete [] array[i];
}
delete [] array;

對于簡單的數組來說 delete [] array 和 delete array,釋放效果相同,原因在于:分配簡單類型內存時,內存大小已經確定,系統可以記憶并且進行管理,在析構時,系統并不會調用析構函數, 它直接通過指針可以獲取實際分配的內存空間,哪怕是一個數組內存空間

class Obj
{public:Obj() { cout << "construct function" <<endl; }~Obj() { cout << "destruct function" <<endl; }
};Obj* ObjArray = new Obj[4];
//1 調用使用類對象的析構函數,2 釋放了 ObjArray 指針指向的全部內存空間
delete [] ObjArray;//1 釋放了 ObjArray 指針指向的全部內存空間 2 只調用了 ObjArray[0]對象的析構函數
delete ObjArray; 

? ? 2.4 :對象釋放之后再次釋放

重復關閉內存(double-free)會導致內存管理器出現問題。重復釋放內存在一定情況下,有可能導致"堆溢出"漏洞,可以被用來執行惡意代碼,具有很大的安全隱患。

所以我們在釋放后,要給指針變量賦值為nullptr,避免野指針,就算再釋放nullptr,也不會有問題。

? ? 2.5?:c/c++內存分配

int g_int1 = 1;
int g_int2 = 0;
int g_int3;
static int g_sInt1 = 1;
static int g_sInt2 = 0;
static int g_sInt3;int main() {int int1 = 1;int int2 = 0;int int3;static int s_int1 = 1;static int s_int2 = 0;static int s_int3;char *p;char *p1;char cStr[20] = "hello world!";char cStr1[10];char cStr2[10];char *qStr = "hello world!";char *qStr1 = "world hello!";p = (char *)malloc(100);p1 = (char *)malloc(100);/* heap area start */printf("p1                  %p, %d\n", p1, p1);printf("p                   %p, %d\n", p, p);/* heap area end /* stack area start */printf("int1                %p, %d\n", &int1, &int1);printf("int2                %p, %d\n", &int2, &int2);printf("int3                %p, %d\n", &int3, &int3);printf("cStr                %p, %d\n", cStr, cStr);printf("cStr1               %p, %d\n", cStr1, cStr1);printf("cStr2               %p, %d\n", cStr2, cStr2);/* stack area end *//* static area start *//* data segment start */printf("s_int1              %p, %d\n", &s_int1, &s_int1);printf("g_sInt1             %p, %d\n", &g_sInt1, &g_sInt1);printf("g_int1              %p, %d\n", &g_int1, &g_int1);/* data segment end *//* bss segment start */printf("s_int3              %p, %d\n", &s_int3, &s_int3);printf("s_int2              %p, %d\n", &s_int2, &s_int2);printf("g_sInt3             %p, %d\n", &g_sInt3, &g_sInt3);printf("g_sInt2             %p, %d\n", &g_sInt2, &g_sInt2);printf("g_int3              %p, %d\n", &g_int3, &g_int3);printf("g_int2              %p, %d\n", &g_int2, &g_int2);/* bss segment end *//* const segment start */printf("world hello!        %p, %d\n", &"world hello!", &"world hello!");printf("qStr                %p, %d\n", qStr1, qStr1);printf("hello world!        %p, %d\n", &"hello world!", &"hello world!");printf("qStr                %p, %d\n", qStr, qStr);    /* const segment end *//* static area end *//* text area start */printf("code addr start:    %p, %d\n", &main, &main);/* text area start */free(p);free(p1);return 0;
}

【關注我,后續持續新增專題博文,謝謝!!!】

下一篇講解

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

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

相關文章

vfrom表單設計器使用事件機制控制字段顯示隱藏

1. 使用表單設計器進行debug調試 依據 vform3.0開發者文檔 https://www.ganweicloud.com/docs/6.1.0/pages/d3e6d9/ 對switch組件設置事件邏輯 調試中

iPhone 和 Android 在日期格式方面的區別

整篇文章由iPhone 和 Android 在日期格式方面有所不同引起,大致介紹了,兩種時間標準,以及在 JavaScript 下的格式轉換方法。 Unix 時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。 iPhone 和 Android 在日期格式方面有所不同。其中,iPhone(iOS)使…

985高校查重率“隱性閾值”:低于5%可能被重點審查!

你是不是也以為&#xff1a; “查重率越低越好&#xff0c;最好壓到1%、0%&#xff0c;導師看了都感動哭&#x1f979;” 但是你不知道的是——在985/211等重點高校&#xff0c;查重率太低反而可能引起導師和學術辦公室的“特別關注”&#xff01; 今天就來扒一扒這個查重圈“…

【NLP】33. Pinecone + OpenAI :構建自定義語義搜索系統

Pinecone OpenAI 中文教學教程&#xff1a;構建自定義語義搜索系統 一、背景介紹 當下 AI 問答系統、矩陣檢索、短文本分類等場景中&#xff0c;都需要很好地實現 “根據輸入進行相似給點搜索”。這種算法基礎稱為 “向量搜索”&#xff0c;它的核心是將文本轉換為向量后&am…

【Mybatis-plus常用語法】

MyBatis-Plus 是 MyBatis 的增強工具&#xff0c;提供了很多便捷的功能來簡化開發。以下是一些 MyBatis-Plus 的常見語法&#xff1a; 實體類注解&#xff1a;使用 TableName 注解來指定實體類和數據庫表的映射關系。 TableName("user") public class User {privat…

Logback官方文檔翻譯章節目錄

Logback官方文檔翻譯章節目錄 第一章 Logback簡介 第二章 Logback的架構&#xff08;一&#xff09; Logback的架構&#xff08;二&#xff09; Logback的架構&#xff08;三&#xff09; 持續更新中…

Python變量作用域

變量作用域是Python編程中非常重要的基礎概念&#xff0c;理解它可以幫助你避免很多常見的錯誤。本文將用簡單易懂的方式&#xff0c;帶你全面掌握Python變量作用域的所有細節。 一、什么是變量作用域&#xff1f; 變量作用域&#xff08;Scope&#xff09;指的是變量在程序中…

初學者的AI智能體課程:構建AI智能體的十堂課

初學者的AI智能體課程:構建AI智能體的十堂課 在人工智能(AI)領域,AI智能體正在逐漸發揮其不容忽視的作用。自動化的智能體不僅僅在理論上廣泛討論,更加在實際應用中開辟了一片新的天地。那么如何動手開發屬于自己的AI智能體呢?Microsoft提供的AI智能體入門課正是為此而設…

【并發編程】MySQL鎖及單機鎖實現

目錄 一、MySQL鎖機制 1.1 按鎖粒度劃分 1.2 按鎖功能劃分 1.3 InnoDB鎖實現機制 (1)記錄鎖(Record Lock) (2) 間隙鎖(Gap Lock) (3) 臨鍵鎖(Next-Key Lock) (4) 插入意向鎖(Insert Intention Lock) 二、基于 JVM 本地鎖實現,保證線程安全 2.1 線程不安全的分析 2.1…

能耗優化新引擎:EIOT平臺助力企業降本增效

安科瑞顧強 數字化轉型的背景下&#xff0c;能源管理正加速向智能化、遠程化方向演進。安科瑞電氣推出的EIOT托管平臺及ADW300系列4G無線計量儀表&#xff0c;通過云端技術與無線通信的深度融合&#xff0c;為用戶打造了高效、便捷的遠程能源監測與管理體系&#xff0c;助力企…

(14)Element Plus項目綜合案例

本系列教程目錄&#xff1a;Vue3Element Plus全套學習筆記-目錄大綱 文章目錄 第3章 綜合案例3.1 搭建項目3.1.1 創建Vite工程3.1.2 配置路由 3.2 登錄模塊頁面3.2.1 注冊頁面3.2.2 登錄頁面3.2.3 忘記密碼頁面 3.3 導航設置3.3.1 頭部3.3.2 側邊欄與底部1&#xff09;頭像部分…

Webug4.0靶場通關筆記22- 第27關文件包含

目錄 一、文件包含 1、原理分析 2、文件包含函數 &#xff08;1&#xff09;include( ) &#xff08;2&#xff09;include_once( ) &#xff08;3&#xff09;require( ) &#xff08;4&#xff09;require_once( ) 二、第27關滲透實戰 1、打開靶場 2、源碼分析 3、…

〖 Linux 〗解決 VS Code 遠程連接服務器的常見問題

文章目錄 解決 VS Code 遠程連接服務器的斷開問題VS Code Remote-SSH一直彈出輸入密碼的問題VsCode C 語法檢測失效不標紅色波浪線 解決辦法卸載擴展方式&#xff1a; 解決vscode C智能提示緩慢 解決 VS Code 遠程連接服務器的斷開問題 解決 vscode 卡頓&#xff0c;卡死&…

ERC-20與ERC-721:區塊鏈代幣標準的雙星解析

一、代幣標準的誕生背景 在以太坊生態中&#xff0c;代幣標準是構建去中心化應用&#xff08;DApps&#xff09;的基石。ERC-20與ERC-721分別代表同質化與非同質化代幣的兩大核心標準&#xff0c;前者支撐著90%以上的加密資產流通&#xff0c;后者則開啟了數字資產唯一性的新時…

C++入門小館 :多態

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

【NextPilot日志移植】整體功能概要

整體日志系統的實現功能 該日志系統主要實現了飛行日志的記錄功能&#xff0c;支持多種日志記錄模式&#xff0c;可將日志存儲到文件或通過 MAVLink 協議傳輸&#xff0c;同時具備日志加密、空間管理、事件記錄等功能。具體如下&#xff1a; 日志記錄模式&#xff1a;支持按武…

數字化轉型:概念性名詞淺談(第二十五講)

大家好&#xff0c;今天接著介紹數字化轉型的概念性名詞系列。 &#xff08;1&#xff09;SOP(標準作業程序) 標準作業程序&#xff08;Standard Operating Procedure, SOPs&#xff09;是在有限時間與資源內&#xff0c;為了執行復雜的日常事務所設計的內部程序。從管理學的…

交叉編譯 opencv-4.10

編譯說明 opencv 下包含很多模塊&#xff0c;各個模塊的作用可以參考Opencv—模塊概覽. 嵌入式考慮有限存儲等因素會對模塊進行裁剪&#xff0c;我這里主要保留圖像拼接&#xff08;stitching&#xff09;圖片編解碼&#xff08;imgcodecs&#xff09;與特征點匹配&#xff08…

Python cv2對象檢測與跟蹤:從基礎到進階實戰

在計算機視覺領域&#xff0c;對象檢測&#xff08;定位目標位置&#xff09;與對象跟蹤&#xff08;持續追蹤目標運動&#xff09;是視頻分析、自動駕駛、智能監控等應用的核心技術。本文將結合OpenCV的cv2庫&#xff0c;系統講解其原理與Python實現方法。 一、對象檢測 vs 對…

亞馬遜推出新型倉儲機器人 Vulcan:具備“觸覺”但不會取代人類工人

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…