編寫安全程式碼——不要用memcmp比較structure
作者:[email protected]
部落格:linuxfocus.blog.chinaunix.net
請看下面的程式碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct padding_type {
short m1;
int m2;
} padding_type_t;
int main()
{
padding_type_t a = {
.m1 = 0,
.m2 = 0,
};
padding_type_t b;
memset(&b, 0, sizeof(b));
if (0 == memcmp(&a, &b, sizeof(a))) {
printf("Equal!\n");
}
else {
printf("No equal!\n");
}
return 0;
}
大家想一想,結果是什麼?
laptop:~/works/test$ gcc -g test.c
laptop:~/works/test$ ./a.out
No equal!
為什麼是這樣呢?其實有經驗的開發都會立刻反應到,這是由於對齊造成的。
沒錯,就是因為struct padding_type->m1的型別是short型,而m2的型別是int型,根據自然對齊的原則。padding_type的每個成員需要對齊到4位元組。因此編譯器會在m1後面插入2個padding位元組,而padding的位元組的值是隨機的。也就是說a中的padding 位元組的值是隨機的,而b中的padding則被清零。所以當使用memcmpy去比較這兩個結構體時,返回值是不等。
從這個例子,我們要記住,在對結構體進行比較時,不要使用位元組比較,如memcmp。除非你人為保證了這些對齊的padding位元組被清零了。否則,會得到意想不到的結果。
相關推薦
編寫安全程式碼——不要用memcmp比較structure
本文的copyleft歸[email protected]所有,使用GPL釋出,可以自由拷貝,轉載。但轉載請保持文件的完整性,註明原作者及原連結,嚴禁用於任何商業用途。作者:[email protected]部落格:linuxfocus.blog.chi
編寫安全程式碼:小心volatile的原子性誤解
這時,exit_flag都需要使用volatile來修飾。不然對於執行緒1的程式碼,如果編譯器發現線上程1的程式碼中沒有任何地方修改exit_flag,有可能會將exit_flag放入暫存器快取。這樣,在每次的條件檢查的時候,都是從暫存器中讀取,而非exit_flag對應的記憶體。這樣將導致每次讀取的值都為0
C++:編寫異常安全程式碼
在C++的使用當中,最令人頭疼的地方莫非是記憶體管理或者異常的使用。 想寫出一個真正異常安全的程式碼是非常難得,需要考慮的因素有非常多。 在現代C++當中也有很多人提倡不使用異常,但是要完全杜絕使用C++異常 也是很難的,除非打算不使用任何一個標準庫,重寫所有需要用的資料結構演算法等等。 在一般情況下
記得比較的時候要用double型別比較,不要用Double,Double是引用型別用==比較不對
記得比較的時候要用double型別比較,不要用Double,Double是引用型別用==比較不對 : //查詢未更新的返利額度 Map<返利大區-額度> preRebateMap List<RebateMont
Integer比較時最好不要用==
上述程式碼的答案,涉及到Java緩衝區和堆的問題。 java中Integer型別對於-128-127之間的數是緩衝區取的,所以用等號比較是一致的。但對於不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。 Integer b3=60,這是一個裝箱過程也就是Integer b3=In
改進Vim體驗:在插入模式下移動光標,我不要用方向鍵!alt快捷鍵使用技巧!
targe 判斷 映射 tar 什麽 nbsp .vimrc 一次 time 改進Vim體驗:在插入模式下移動光標,我不要用方向鍵!alt快捷鍵使用技巧! 大家都知道,我們在插入模式下編輯代碼的時候 若想寫完這一部分後,移動到鄰近的一部分,如下一個單詞的後面,是很復雜的
dos下用fc比較文件
fc 文件比較fc: 1.fc是什麽: fc是file compare的縮寫,即文件比較 2.fc可以用來幹什麽: 官方解釋:比較兩個文件或兩個文件集並顯示它們之間的不同 個人理解:fc打印出兩個文件之間的內容,讓命令使用者可以直觀的看到兩文件之間的區別,但是看不到兩個文件之間功能的地方;所以可以用來查
vue中v-for索引不要用key
spa 定義 pan class col color key 特性 不出 今天發現在給元素v-for渲染的時候,想給元素添加key特性存儲索引,發現不奏效: <div class="apic" v-for="(pic,index) in msg.pics" ..
input checkbox操作,最好用prop,不要用attr
sel 好用 else == all select box ctc () $(".selectAll").on(‘click‘,function(){ if($(this).attr(‘data‘) == 1){ $(".selectCheckBox")
編寫有效的業務用例 讀書筆記03
用例 guarantee 層次 中間 目標 全局 尋找 過程 簡單 第五章 三個命名的目標層次 1、用戶目標(藍色,海平面)(user goal),它是主執行者努力使工作得以完成的目標,或是用戶使用系統的目標。它相當於業務過程工程中的“基本業務過程”。 2、概要層次目標(白
編寫有效的業務用例 讀書筆記04
路徑 發生 時間 易懂 開始 完整 條件語句 之間 意思 第七章 場景和步驟 1、主成功場景就是主執行者完成了目標,所有項目相關人員的利益都被滿足了的場景。 2、主成功場景和所有場景擴展都包含的元素 主成功場景 擴展場景 場景執行的條件 前置條件加上
用python比較兩個文件中內容的不同之處, 並輸出行號和內容.
exist file diff pre ffline += == list cmp 代碼部分: ‘‘‘cmpfile.py - 比對兩個文件, 如果有不同之處, 打印內容和行號‘‘‘ import os class cmpFile: def __init__(
安全測試===任意用戶密碼重置的10種常見姿勢
tab html http 用戶 nba tps blog https art https://www.ichunqiu.com/course/59045 http://www.freebuf.com/articles/web/164510.html http://ww
切換controller 後面的最好不要用id參數,不然會根據路由規則改變
edit 改變 val body ret ont bsp IT 規則 //切換actionResult return RedirectToAction("Edit", "EngineeringCase", new { id = retValue.Va
能用HTML/CSS解決的問題,就不要用JS
如果 right 樣式 info 維護 clas abs 高亮 代碼 原因:簡單。 簡單就意味著更快的開發速度,更小的維護成本,同時往往具有更好的體驗。 一,導航高亮 效果圖: 代碼: <!DOCTYPE html> <html lang="en"&g
編寫一個模擬註冊用戶和驗證用戶登陸的程序
一個 input bsp BE 不存在 == code AS ges import hashlib import loggin User_pass = {‘11‘:‘ e1942a04175fdbe80e7fea0c40f7bf54‘} def get_md5(self):
系統安全保護 配置用戶環境 配置高級連接 防火墻策略管理
拒絕 簡單 disabled var 進制 inux enable wall 熱備份 SELinux概述? Security-Enhanced Linux – 美國NSA國家安全局主導開發,一套增強Linux系統安全的強制訪問控制體系– 集成到Linux內核(2.6及以上)
Mybatis 為什麽不要用二級緩存
好處 ace class from spa urn 高效 details 保存 https://www.cnblogs.com/liouwei4083/p/6025929.html mybatis 二級緩存不推薦使用 一 mybatis的緩存使用。 大體就是首先根據
第六章:編寫安全應用
利用 flash 網站 這一 ade 第六章 用戶數據 ack else 很多時候,安全應用是以犧牲復雜度(以及開發者的頭痛)為代價的。Tornado Web服務器從設計之初就在安全方面有了很多考慮,使其能夠更容易地防範那些常見的漏洞。安全cookies防止用戶的本地狀態被
網站安全檢測之用戶密碼找回網站漏洞的安全分析與利用
安全測試 短信驗證 網站漏洞 -o 一個 驗證碼 做到 重要 添加 我們SINE安全在對網站,以及APP端進行網站安全檢測的時候發現很多公司網站以及業務平臺,APP存在著一些邏輯上的網站漏洞,有些簡簡單單的短信驗證碼可能就會給整個網站帶來很大的經濟損失,很簡單的網站功能,比