linux 内存越界判断_LINUX 共享内存越界
shmget的時(shí)候,我們能指定共享內(nèi)存的size,當(dāng)size越界的時(shí)候,會如何呢?
如下:
/*
*?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();
}
之上是對共享內(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
對數(shù)據(jù)進(jìn)行超過兩個(gè)字節(jié)的write:
./shareMem --action=1 --len=2 --msg=helloworld --id=557070
后進(jìn)行read,發(fā)現(xiàn)一切正常。
是不是shm對越界不做判斷了?多出的字節(jié)寫到了哪里呢?其實(shí)不然,shm的分配會自動補(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 共享内存越界的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java修改hidden_Java Co
- 下一篇: 传奇个性名字(传奇个性游戏名字大全)