修正以下漏洞:
1、逃过 continue
2、主菜单按 enter 导致退出程序
确保上面源代码能通过 TC 2.0~3.0、 MVC++ 6.0、GCC 3.4~4.1 编译,并且无错、无警告
2、
解释导致上面漏洞出现的原因
代码: 全选
// line structure
// sequential storage form
// Last Modified: 2008-03-21
// Last Modified: 2008-04-24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_MAX_SIZE 5
typedef struct
{
char data[LIST_MAX_SIZE];
int length;
} data_obj;
void init(data_obj *d)
{
d->length = 0;
printf("\n");
printf("\n init list ");
printf("\n d->length = %d ", d->length);
printf("\n");
printf("\n continue ");
getchar();
}
// tO(1)
void destory(data_obj *d)
{
d->length = 0;
printf("\n");
printf("\n destory list ");
printf("\n");
printf("\n continue ");
getchar();
}
// tO(1)
int insert(data_obj *d, char val, int pos)
{
int i = 0;
if (d->length == LIST_MAX_SIZE)
{
printf("\n");
printf("\n no space ");
return 0;
}
if ( (pos < 1) || ((pos - d->length) > 1) )
{
printf("\n");
printf("\n error position ");
getchar();
return 0;
}
for (i = d->length; i >= pos; i--)
{
d->data[i] = d->data[i - 1];
}
d->data[pos - 1] = val;
d->length++;
printf("\n");
printf("\n continue ");
getchar();
return 1;
}
void print(data_obj *d)
{
int i;
if (d->length)
{
printf("\n");
for (i = 0; i < d->length; i++)
{
printf("\n %d: ", i + 1);
printf("%c", d->data[i]);
}
}
else
{
printf("\n");
printf("\n no record \n");
}
printf("\n");
printf("\n continue ");
getchar();
getchar();
}
int main()
{
void init(data_obj *d);
void destory(data_obj *d);
int insert(data_obj *d, char val, int pos);
/*
int remove(data_obj *d);
void locate(data_obj *d);
*/
void print(data_obj *d);
char key;
char value;
int position;
data_obj *d;
d = (data_obj *)malloc(sizeof(data_obj));
printf("\n");
printf("\n line structure - sequential storage form ");
init(d);
do
{
printf("\n");
printf("\n 1. init ");
printf("\n 2. destory ");
printf("\n");
printf("\n 3. insert ");
/*
printf("\n 4. remove ");
printf("\n 5. locate ");
printf("\n");
*/
printf("\n 6. print ");
printf("\n");
printf("\n 0|q quit ");
printf("\n");
printf("\n ");
scanf("%c", &key);
switch(key)
{
case '1':
printf("\n");
init(d);
break;
case '2':
destory(d);
break;
case '3':
printf("\n");
printf("\n insert value: ");
getchar();
scanf("%c", &value);
printf("\n insert position: ");
scanf("%d", &position);
insert(d, value, position);
break;
/*
case '4':
remove(s);
break;
case '5':
locate(s);
break;
*/
case '6':
print(d);
break;
case '0':
goto QUIT_FLAG;
}
} while ((key <= '9') && (key >= '0'));
QUIT_FLAG:
return 0;
}