ソフトウェアテスト実験報告
15494 ワード
:
:
/*************************************************************************
> File Name: 1.cpp
> Author:
> Mail:
> Created Time: 2017 05 19 14 39 38
************************************************************************/
#include
#include
#include
int main(){
char *a;
while(1){
a = (char *)malloc(1000);
}
free(a);
}
実行結果:システムログ印刷結果:エラー原因:デッドサイクルでメモリが無限に割り当てられ、解放されず、out of memエラー(メモリ消費)が発生します.実験2:/*************************************************************************
> File Name: 4.1.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 15 37 52
************************************************************************/
#include
#include
#include
using namespace std;
typedef struct listrec {
int a;
int b;
int value;
struct listrec *next;
}listrec;
listrec * add_list_entry(listrec *entry ,int value){
listrec *new_entry = (listrec *)malloc(sizeof(listrec));
if(!new_entry){
return NULL;
}
new_entry->value = value;
if(!entry){
return NULL; /* */
}
new_entry->next = entry->next;
entry->next = new_entry;
return new_entry;
}
int main(){
listrec * node = NULL;
while(1){ /* out of mem */
add_list_entry(node,10);
}
return 0;
}
エラー実行結果:原因と修正:依然としてメモリ漏洩エラーであり、コードはentryが空であると判断した後、割り当てられたメモリを解放しなかった.実験3:#include
using namespace std;
int slot_table[5] = {1,2,3,4,5};
int search_slots(int port){
int i = 0;
while(++i < port){
if(slot_table[i] > port) /* port */
return slot_table[i];
}
return 0;
}
int main(){
search_slots(10);
}
エラーセット修正:portの範囲が確定していない場合、portが非常に大きい場合、このプログラムは無限にループし、障害が発生する可能性があります.実験四:#include
#include
#include
using namespace std;
int main(){
/* */
char buff1[100] = {0};
char buff2[200] = {0};
memcpy(buff1,buff2,200);
return 0;
}
エラー原因:C/C++プログラムのランタイムスタック構造を無視し、コピー中にプログラムの戻りアドレスを上書きし、プログラム実行がクラッシュした.実験5:#include
#include
#include
#include
using namespace std;
char *readline(char *buf){
char c ;
char *savebuf = buf;
while(c != EOF && (c = getchar()) != '
'){
*buf++ = c;
}
*buf = '\0';
if(c == EOF && buf == savebuf)
return NULL;
else
return savebuf;
}
int main(){
char buf[100];
readline(buf);
printf("%s
",buf);
}
プログラム脆弱性:char cに初期値を付与して、プログラムの使用中に予想外のエラーが発生しないようにすることが望ましい.実験6:/*************************************************************************
> File Name: 4.1.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 15 37 52
************************************************************************/
#include
#include
#include
using namespace std;
typedef struct listrec {
int a;
int b;
int value;
struct listrec *next;
}listrec;
listrec * add_list_entry(listrec *entry ,int value){
listrec *new_entry = (listrec *)malloc(sizeof(listrec));
if(!new_entry){ /* malloc */
return NULL;
}
new_entry->value = value;
new_entry->next = entry->next;
entry->next = new_entry;
return new_entry;
}
int main(){
listrec * node ;
add_list_entry(node,10);
return 0;
}
コード・ホール:図面の寸法に注意してください.mallocは空の値を返す可能性があります.実験7:#include
#include
#include
#include
using namespace std;
int main(){
FILE *fd1;
int access;
fd1 = fopen("text.tst","w+");
if(access < 0){
return 0;
}
fclose(fd1);
return 0;
}
コードエラー:プログラムがリソース文を閉じる前に条件付き終了コード文が発生し、システムリソースが安全に解放されない可能性があります.実験8:#include
#include
#include
#include
#include
using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int tmp;
void* thread(void *arg){
cout << "thread id is " << pthread_self() << endl;
pthread_mutex_lock(&mutex); /* */
tmp = 12;
cout << "Now a is " << tmp << endl;
pthread_mutex_unlock(&mutex);
return NULL;
}
int main(){
pthread_t id;
cout << "main thread id is " << pthread_self() << endl;
tmp = 3;
cout << "In main func tmp = " << tmp << endl;
if (!pthread_create(&id, NULL, thread, NULL))
{
cout << "Create thread success!" << endl;
}
else
{
cout << "Create thread failed!" << endl;
}
pthread_join(id, NULL);
pthread_mutex_destroy(&mutex);
return 0;
実行結果:脆弱性:このコード自体にエラーはなく、値の注意は変数を変更する際にロックを考慮する必要があることです.実験9:#include
#include
#include
#include
using namespace std;
int main(int argc ,char **argv){
short lastError;
/* */
/*char buff[1100];*/
char argvBuffer[5];
if(argc == 2){
strcpy(argvBuffer,argv[1]);
}
printf("%s
",argvBuffer);
return 0;
}
結果:エラーの原因:バッファargvbufferの開発が小さすぎて、事前推定が不足して、プログラムがエラーしました.修正:1.バッファ2を大きくする.判断サイズ実験10:/*************************************************************************
> File Name: 4.48.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 17 33 02
************************************************************************/
#include
using namespace std;
int main(){
char fixed_buf[10];
sprintf(fixed_buf,"abcdexklamx;sadasdasdasdasdalmx;"); /* */
return 0;
}
結果:エラーの原因:関数境界とバッファの長さに注意します.実験11:/*************************************************************************
> File Name: 4.49.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 17 34 45
************************************************************************/
#include
using namespace std;
int main(int argc ,char **argv){
short lasterr;
char argvBuffer[16];
if(argc == 2){
strcpy(argvBuffer,argv[1]); /* argv[1] */
}
}
結果:境界が直接コピーできないことを確認してください.そうしないと、エラーが発生します.実験12:/*************************************************************************
> File Name: 4.51.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 17 37 58
************************************************************************/
#include
#include
#include
#include
#include
void thread(void)
{
FILE *fp;
fp = fopen("name","w");
fclose(fp);
}
int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);// 0,
if(ret!=0) {
printf ("Create pthread error!
");
exit(1);
}
pthread_join(id,NULL);
return (0);
}
コード・ホール:マルチスレッドの複数回のオープンに失敗したエラーが発生しやすい.実験13:/*************************************************************************
> File Name: 4.55.c
> Author:
> Mail:
> Created Time: 2017 05 19 11 17 38
************************************************************************/
#include
#include
#include
#include
#define MAX 64
static int do_edit(const char * filename_arg,char *buf){
char fnametemp[MAX];
FILE * stream = NULL;
const char *fname;
int error = -1;
int fd;
if(filename_arg){
fname = filename_arg;
}else{
GetTempFileName(".","psql",0,fnametemp);
fname = (const char *)fnametemp;
printf("%s
",fname);
}
}
int main(){
char * name;
char buf[100];
do_edit(name,buf);
return 0;
}
脆弱性:getfilenameの3番目のパラメータは乱数でなければなりません.実験14:/*************************************************************************
> File Name: 4.58.cpp
> Author:
> Mail:
> Created Time: 2017 05 19 11 42 08
************************************************************************/
#include
#include
#include
int main(int argc,char **argv){
char *arga[] ={"ls", "-al", "/etc/passwd", NULL};
char *envp[] ={"PATH=/bin", NULL};
execve("/bin/ls", arga, envp); /* */
return 0;
}
コード脆弱性:注意/bin下の実行可能ファイルが置き換えられ、不安全なコードが実行されました.実験十五:/*************************************************************************
> File Name: 4.61.c
> Author:
> Mail:
> Created Time: 2017 05 19 11 58 26
************************************************************************/
#include
#include
#include
#include
#include
#include
void bind_socket(void){
int server_sockfd;
int server_len;
struct sockaddr_in server_address;
unlink("server_socket");
server_sockfd = socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family = AF_INET;
server_address.sin_port = 21;
server_address.sin_addr.s_addr = htonl(INADDR_ANY); /* , SO_REUSEADDR */
server_len = sizeof(struct sockaddr_in);
bind(server_sockfd,(struct sockaddr *)&s1,server_len);
}
脆弱性:ポートがハイジャックされたことに注意して、SO_REUSEADDR解決.実験16:/*************************************************************************
> File Name: 4.67.c
> Author:
> Mail:
> Created Time: 2017 05 19 13 21 16
************************************************************************/
#include
#include
#include
//char * constbuf = "./bash";
int main(){
char buf[100];
memset(buf,'\0',100);
scanf("%s",buf);
system("echo \"const string : no warining \"");
//system(constbuf);
system(buf); /* */
popen("echo ok","r");
//popen(constbuf,"r");
popen(buf,"r");
return 0;
}
実行結果:エラーの原因:システム呼び出しでバッファの内容を実行しないでください.これは危険で、ユーザーが任意のコードを実行する可能性があります.実験17:/*************************************************************************
> File Name: 4.71.c
> Author:
> Mail:
> Created Time: 2017 05 19 13 34 44
************************************************************************/
#include
#include
#include
#include
#include
int main(int argc,char **argv){
int fd;
if((fd = open(argv[1],0)) == -1){
printf("can't open %s ",argv[1]);
return -1;
}
if(argc == 2){
if(execlp("ls","ls","-a",argv[1],(char *)0)){ /* execve*/
}else{
printf("can't execute %s
",argv[1]);
}
}
return 0;
}
検索実行は、非常に安全ではない方法です.実験18:/*************************************************************************
> File Name: 4.76.c
> Author:
> Mail:
> Created Time: 2017 05 19 14 00 07
************************************************************************/
#include
#include
#include
void foo(void){
pid_t id = fork();
if(id == -1){
//error
}else if(id){
}else{
}
}
脆弱性:システム関数、realloc、vforkを慎重に使用し、予期せぬメモリレプリケーションを回避します.実験20:/*************************************************************************
> File Name: 4.79.c
> Author:
> Mail:
> Created Time: 2017 05 19 14 03 36
************************************************************************/
#include
#include
#include
#include
int main(int argc,char ** argv){
int fh;
fh = creat("/usr/bin/file",O_WRONLY | O_CREAT | O_TRUNC);
if(fh == -1){
return -1;
}else{
write(fh,argv[1],sizeof(argv[1]));
close(fh);
}
return 0;
}
エラー:1.絶対経路の露出を避ける.2.実行可能ファイルへの書き込みは避ける.実験21:#include
#include
#include
#include
using namespace std;
class base{
public :
char *p;
public :
base(){
p = new char[strlen("default value")+1];
strcpy(p,"default value");
printf("base constructor is calling
");
}
/*double free*/
/*base(base &a){
printf("base copy constructor is calling
");
p = new char[strlen(a.p)+1];
strcpy(p,a.p);
}*/
void setp(const char *s){
if(p != NULL) delete []p;
p = new char[strlen(s)+1];
strcpy(p,s);
}
~base(){
if(p){
delete []p;
p = NULL;
}
}
};
class derive: public base{
public:
derive()
{
}
/* derive(& a), */
};
int main(int argc ,char **argv){
derive c;
c.setp("this is c");
derive b(c);
printf("
");
printf("c : %s
",c.p);
printf("b : %s
",b.p);
return 0;
}
結果:複製構造関数base(base&a)が欠け、*pが2回解放するdouble freeが発生する.実験二十二:/*************************************************************************
> File Name: 4.8.cpp
> Author:
> Mail:
> Created Time: 2017 05 18 16 35 14
************************************************************************/
#include
#include
#include
using namespace std;
class base{
public:
char *p;
base(){
p = new char[strlen("default value") + 1];
strcpy(p,"default value");
}
/* double free*/
/*base &operator = (const base & a){
if(&a == this)
return *this;
delete []p;
p = new char[strlen(a.p)+1];
strcpy(p,a.p);
return *this;
}*/
void setp(const char *s){
p = new char[strlen(s)+1];
strcpy(p,s);
}
~base(){
if(p){
delete[] p;
p = NULL;
}
}
};
int main(){
base a,b;
b = a;
return 0;
}
原因:重荷重"="が発生するdaouble free. 原文を参照:http://zmrlinux.com/2017/06/21/%e8%bd%af%e4%bb%b6%e6%b5%8b%e8%af%95%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a/