日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 内存越界判断_LINUX 共享内存越界

發(fā)布時(shí)間:2024/9/19 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 内存越界判断_LINUX 共享内存越界 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shmget的時(shí)候,我們能指定共享內(nèi)存的size,當(dāng)size越界的時(shí)候,會(huì)如何呢?

如下:

/*

*?ShareMem.h

*

*??Created?on:?2013-2-25

*??????Author:?coreycui

*/

#ifndef?SHAREMEM_H_

#define?SHAREMEM_H_

#include?

#include?

#include?

#include?

#include?

#include?

#include?

#include?

#include?

#include?

usingnamespacestd;

classShareMem?{

public:

ShareMem(int_shmid);

boolcreate(intflag,intlen);

intgetSgmId()const;

char*?attach();

booldettach();

virtual~ShareMem();

private:

intshmId;

boolisAttche;

char*?addr;

};

#endif?/*?SHAREMEM_H_?*/

/*

* ShareMem.h

*

* Created on: 2013-2-25

* Author: coreycui

*/

#ifndef SHAREMEM_H_

#define SHAREMEM_H_

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

class ShareMem {

public:

ShareMem(int _shmid);

bool create(int flag,int len);

int getSgmId() const;

char* attach();

bool dettach();

virtual ~ShareMem();

private:

int shmId;

bool isAttche;

char* addr;

};

#endif /* SHAREMEM_H_ */

/*

*?ShareMem.cpp

*

*??Created?on:?2013-2-25

*??????Author:?coreycui

*/

#include?"ShareMem.h"

ShareMem::ShareMem(int_shmid)?:

shmId(_shmid),?isAttche(false),?addr(0)?{

}

boolShareMem::create(intflag,intlen)?{

shmId?=?shmget(IPC_PRIVATE,?len,?flag);

if(shmId?

perror("share?mem?create?error");

}

returntrue;

}

intShareMem::getSgmId()const{

returnshmId;

}

char*?ShareMem::attach()?{

isAttche?=true;

char*?addr?=?(char*)?shmat(shmId,?0,?0);

if(addr?

perror("share?mem?attach?error");

}

returnaddr;

}

boolShareMem::dettach()?{

if(addr?==?0?&&?isAttche)?{

if(shmdt(addr)?>?0)?{

returntrue;

}else{

perror("share?mem?dettach?error");

returnfalse;

}

}

returnfalse;

}

ShareMem::~ShareMem()?{

dettach();

}

constoption?options[]?=?{?{"len",?required_argument,?NULL,'l'},?{"action",?required_argument,?NULL,'a'},?{"id",

required_argument,?NULL,'i'},?{"msg",?required_argument,?NULL,'m'},?{?0,?0,?0,?0?}?};

intmain(intargc,char**argv)?{

charcFileName[128];

intlen;

intch;

intaction;

intid;

charmsg[10000];

while((ch?=?getopt_long(argc,?argv,":l:a:i:",?options,?NULL))?!=?-1)?{

switch(ch)?{

case'l':

len?=?atoi(optarg);

break;

case'a':

action?=?atoi(optarg);

break;

case'i':

id?=?atoi(optarg);

break;

case'm':

strcpy(msg,?optarg);

break;

default:

break;

}

}

cout?<

//cout?<

ShareMem?mem(id);

intlockResult;

if(action?==?0)?{

mem.create(IPC_CREAT?|?0666,?len);

}

if(action?==?1)?{

char*?addr?=?mem.attach();

cout?<

cout?<

strcpy(addr,?msg);

}

if(action?==?2)?{

char*?addr?=?mem.attach();

cout?<

cout?<

}

if(action?==?3)?{

for(inti=0;i<9999;i++){

msg[i]='a';

}

msg[9999]='\0';

char*?addr?=?mem.attach();

cout?<

strcpy(addr,?msg);

}

cout?<

pause();

}

/*

* ShareMem.cpp

*

* Created on: 2013-2-25

* Author: coreycui

*/

#include "ShareMem.h"

ShareMem::ShareMem(int _shmid) :

shmId(_shmid), isAttche(false), addr(0) {

}

bool ShareMem::create(int flag, int len) {

shmId = shmget(IPC_PRIVATE, len, flag);

if (shmId < 0) {

perror("share mem create error");

}

return true;

}

int ShareMem::getSgmId() const {

return shmId;

}

char* ShareMem::attach() {

isAttche = true;

char* addr = (char*) shmat(shmId, 0, 0);

if (addr < (char*) 0) {

perror("share mem attach error");

}

return addr;

}

bool ShareMem::dettach() {

if (addr == 0 && isAttche) {

if (shmdt(addr) > 0) {

return true;

} else {

perror("share mem dettach error");

return false;

}

}

return false;

}

ShareMem::~ShareMem() {

dettach();

}

const option options[] = { { "len", required_argument, NULL, 'l' }, { "action", required_argument, NULL, 'a' }, { "id",

required_argument, NULL, 'i' }, { "msg", required_argument, NULL, 'm' }, { 0, 0, 0, 0 } };

int main(int argc, char **argv) {

char cFileName[128];

int len;

int ch;

int action;

int id;

char msg[10000];

while ((ch = getopt_long(argc, argv, ":l:a:i:", options, NULL)) != -1) {

switch (ch) {

case 'l':

len = atoi(optarg);

break;

case 'a':

action = atoi(optarg);

break;

case 'i':

id = atoi(optarg);

break;

case 'm':

strcpy(msg, optarg);

break;

default:

break;

}

}

cout << "len:" << len << " action:" << action << " id:" << id << " msg:" << msg << endl;

//cout << "pageSize:" << PAGE_SIZE << endl;

ShareMem mem(id);

int lockResult;

if (action == 0) {

mem.create(IPC_CREAT | 0666, len);

}

if (action == 1) {

char* addr = mem.attach();

cout << "sizeof:" << strlen(addr) << endl;

cout << "msg sizeof" << strlen(msg) << endl;

strcpy(addr, msg);

}

if (action == 2) {

char* addr = mem.attach();

cout << "len.addr:" << strlen(addr) << endl;

cout << "addr:" << addr << endl;

}

if (action == 3) {

for(int i=0;i<9999;i++){

msg[i]='a';

}

msg[9999]='\0';

char* addr = mem.attach();

cout << "msg sizeof" << strlen(msg) << endl;

strcpy(addr, msg);

}

cout << lockResult << endl;

pause();

}

之上是對(duì)共享內(nèi)存的封裝,首先我們建立一塊共享內(nèi)存:

./shareMem --action=0 --len=2 --msg=helloworld --id=0

------ Shared Memory Segments --------

key ? ? ? ?shmid ? ? ?owner ? ? ?perms ? ? ?bytes ? ? ?nattch ? ? status

0x00005feb 0 ? ? ? ? ?admin ? ? 666 ? ? ? ?12000 ? ? ?3

0x00005fe7 32769 ? ? ?admin ? ? 666 ? ? ? ?524288 ? ? 2

0x00005fe8 65538 ? ? ?admin ? ? 666 ? ? ? ?2097152 ? ?1

0x0003022a 131075 ? ? admin ? ? 777 ? ? ? ?2072 ? ? ? 1

0x0003022b 163844 ? ? admin ? ? 777 ? ? ? ?5603392 ? ?1

0x00030227 196613 ? ? admin ? ? 777 ? ? ? ?221248 ? ? 1

0x73010002 262150 ? ? admin ? ? 666 ? ? ? ?8 ? ? ? ? ?0

0x29481458 327688 ? ? mqq ? ? ? 644 ? ? ? ?114744 ? ? 0

0x29481456 360457 ? ? mqq ? ? ? 644 ? ? ? ?11380552 ? 0

0x29481457 393226 ? ? mqq ? ? ? 644 ? ? ? ?8020508 ? ?0

0x000033b0 425995 ? ? mqq ? ? ? 666 ? ? ? ?114688 ? ? 0

0x00000000 589839 ? ? coreycui ?666 ? ? ? ?2 ? ? ? ? ?0

對(duì)數(shù)據(jù)進(jìn)行超過(guò)兩個(gè)字節(jié)的write:

./shareMem --action=1 --len=2 --msg=helloworld --id=557070

后進(jìn)行read,發(fā)現(xiàn)一切正常。

是不是shm對(duì)越界不做判斷了?多出的字節(jié)寫到了哪里呢?其實(shí)不然,shm的分配會(huì)自動(dòng)補(bǔ)全到系統(tǒng)的PAGESIZE,32bit的機(jī)器上一般都是4096,不妨,我們寫入10000字節(jié)。果然發(fā)生了段錯(cuò)誤。所以這里我們必須做出判斷。

bool ShareMem::getInfo(shmid_ds* buf) {

return shmctl(this->shmId, IPC_STAT, buf);

}

所以使用之前,我們必須得到內(nèi)存塊的大小,幫助我們更方便和安全的使用這塊內(nèi)存:

if (action == 4) { shmid_ds info; mem.getInfo(&info); cout << "shm seg len:" << info.shm_segsz << endl; }

總結(jié)

以上是生活随笔為你收集整理的linux 内存越界判断_LINUX 共享内存越界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。