Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用Visual Studio 2012是否会意外损坏系统文件或个人文件_C_Visual Studio_Visual Studio 2012_Structure_Infinite Loop - Fatal编程技术网

C 使用Visual Studio 2012是否会意外损坏系统文件或个人文件

C 使用Visual Studio 2012是否会意外损坏系统文件或个人文件,c,visual-studio,visual-studio-2012,structure,infinite-loop,C,Visual Studio,Visual Studio 2012,Structure,Infinite Loop,我很抱歉对这件事缺乏了解,但这对我来说非常重要,所以至少我会尝试一下。 我正在Windows 7 ultimate上使用Visual Studio 2012 express, 我已经写了一些非常基本的程序来练习C语言的结构。不幸的是,我写的其中一个方法有一个错误的停止条件,它进入无限循环,更糟糕的是它超过了给定的数组边界。我将在下面添加代码,但代码不是我主要关心的问题,因为我已经设法修复了它,我只想知道我是否可以用给定的方法损坏我的系统或我的个人文件(视频、照片、办公室文件等),因为当我尝试运行

我很抱歉对这件事缺乏了解,但这对我来说非常重要,所以至少我会尝试一下。 我正在Windows 7 ultimate上使用Visual Studio 2012 express, 我已经写了一些非常基本的程序来练习C语言的结构。不幸的是,我写的其中一个方法有一个错误的停止条件,它进入无限循环,更糟糕的是它超过了给定的数组边界。我将在下面添加代码,但代码不是我主要关心的问题,因为我已经设法修复了它,我只想知道我是否可以用给定的方法损坏我的系统或我的个人文件(视频、照片、办公室文件等),因为当我尝试运行此代码时,发生了一件可怕的事情,我的电脑开始“嘟嘟”响无休止地每0.5秒一次,我无法阻止它,程序处于无限循环中,我只能用Ctrl+Alt+Del来停止这个“乐趣”。我以前写过多次崩溃的代码,但我不确定我的电脑第一次发出哔哔声。我希望专家能帮我解决这个问题。非常感谢

导致所有问题的无限循环方法是“printarrho”:

#包括
#包括
结构日期{
整数日、月、年;
}类型定义日期;
结构超级英雄{
字符名[30];
双功率,速度;
生日;
}typedef sp_;
无效打印信息(sp_s hero){
printf(“超级英雄信息:\n名称:[%s]\n”,hero.name);
printf(“Power:[%.2lf]\n”,hero.Power);
printf(“速度:[%.2lf]\n”,英雄.Speed);
printf(“生日:[%d/%d/%d]\n\n”,hero.birth.day,hero.birth.month,hero.birth.year);
}
void addHero(sp_s arr[],int*k,sp_s newHero){
arr[*k]=newHero;
(*k)++;
printf(“\n成功!添加了一个新的超级英雄。\n”);
}
无效打印阵列(sp_s阵列[]){
int j=0;
while(arr[j]!=NULL){
printf(“[#%d]>>>>>>>>\n”,j+1);
printInfo(arr[j]);
j++;
}
}
void main(){
sp_s myHeros[100];
斯普·纽赫罗;
int i=-1;
int k=0;
而(i!=0){//菜单循环
printf(“欢迎来到我的游戏!\n”);
printf(“要添加英雄,请按1\n”);
printf(“要找到你最强大的英雄,请按2\n”);
printf(“要找到最快的英雄,请按3\n”);
printf(“查看所有英雄列表4\n”);
printf(“要退出,请按0\n”);
scanf(“%d”、&i);
开关(一){
案例0:
打破
案例1:
printf(“请输入#%d个英雄特征:\n名称:”,k+1);
scanf(“%s”和&newHero.name);
printf(“电源:”);
scanf(“%lf”和newHero.power);
printf(“速度:”);
scanf(“%lf”、&newHero.speed);
printf(“出生日期[xx/xx/xx](格式):”;
scanf(“%d/%d/%d”、&newHero.birth.day、&newHero.birth.month、&newHero.birth.year);
addHero(myHeros,&k,newHero);//现在,当我收集制作新英雄所需的所有信息时,让我们将其发送到函数,并将其放在数组中的#k位置
打破
案例2:
打破
案例3:
打破
案例4:
普林塔赫罗(myHeros);
打破
}//开关盒末端
}//while菜单循环
}//主要
如果我可能伤害我的个人文件(视频、照片、办公室文件等)

Windows程序在当前用户的上下文中运行,可以执行当前用户的任何操作。这意味着它可以编辑和删除您的个人文件

一般来说,一个程序要成为流氓程序,它需要在其中包含活动。删除文件的程序可以更容易地开始意外删除文件。 编辑文件的程序可以进行不可靠的编辑

这不是一个先决条件,因为一旦它停止在您的设计之外执行,任何事情都可能发生

如果我能伤害我的身体

要使系统受损,您需要以管理员身份运行。这使程序能够执行管理员可以执行的任何操作,包括严重损坏您的机器

还有一个阶段是
系统
,它比管理员更能完全控制机器

有可能吗? 虽然这是可能的,但可能性不大。现代程序可能会在损坏当前打开的文件之前崩溃,但是您可以采取一些措施降低或限制损坏的可能性

    >P>如果您的用户有重要文件,则考虑切换到不同的帐户进行开发。这将限制错误程序可能造成的损害

  • 确保运行时用户访问保护未关闭。这限制了程序管理计算机的能力

  • 考虑另一种平台,raspberry pi或Intel compute stick提供了一种便宜的平台,如果出现问题,可以重新构建
在这种情况下会发生什么

假设它卡在循环中,没有正确读取数据(可能是scanf()返回0)

数组被全部100个元素填满,然后开始损坏堆栈

有两种合理的内存布局(windows x86/x86-64)

在第一种情况下,数组被覆盖,返回地址被修改。正常的编译器(安全cookie)中内置了代码,可以检测到这种情况,结果是在坏东西发生之前崩溃

在第二种情况下,变量k的内存被一个数组写入操作覆盖。然后将k发送到某个奇怪的地方,随机内存被覆盖。这可能会损坏程序数据,但第一次尝试非自然k(0-99之外)很可能会导致崩溃

可能的失败是
#include<stdio.h>  
#include<string.h>


struct Date{

    int day, month, year;

} typedef date_s;

struct Superhero{

    char name[30];

    double power, speed;

    date_s birthday;

} typedef sp_s;


void printInfo(sp_s hero){

    printf("Super hero info:\nName:  [%s]\n" , hero.name);

    printf("Power: [%.2lf]\n" , hero.power);

    printf("Speed: [%.2lf]\n" , hero.speed);

    printf("Birthday: [%d/%d/%d]\n\n" , hero.birthday.day, hero.birthday.month, hero.birthday.year );

}


void addHero (sp_s arr[], int *k, sp_s newHero){

    arr[*k] = newHero;
    (*k)++;
    printf("\nSuccess! a new superhero is added.\n"); 
}

void printArrHero (sp_s arr[]){

    int j=0;

    while ( arr[j] != NULL ){

        printf("[#%d]>>>>>>>>>>>>>>>>>>\n" , j+1); 

        printInfo( arr[j] );

        j++;
    }


}

void main(){

    sp_s myHeros[100];
    sp_s newHero;

    int i = -1;
    int k = 0;

    while (i != 0){ // menu loop
        printf("Welcome to my game!\n"); 
        printf("To add a hero press 1\n");
        printf("To find you're strongest hero press 2\n");
        printf("To find you're fastest hero press 3\n");
        printf("To see all of you're heroes list 4\n");
        printf("To exit press 0\n");
        scanf("%d" , &i);

        switch (i){
        case 0:
            break;

        case 1:
            printf("Please enter the #%d hero characteristics:\nName: " , k+1);
            scanf("%s" , &newHero.name);
            printf("Power: ");
            scanf("%lf" , &newHero.power);
            printf("Speed: ");
            scanf("%lf" , &newHero.speed);
            printf("Birth date [xx/xx/xx](format): ");
            scanf("%d/%d/%d" , &newHero.birthday.day, &newHero.birthday.month, &newHero.birthday.year);

            addHero(myHeros, &k, newHero); // now when I collecten all the info needed to make a new hero lets send it to the func tht puts it in the #k place in the array
            break;

        case 2:

            break;
        case 3:

            break;

        case 4:
            printArrHero(myHeros);
            break;

        } // END of switch-case

    } // while menu loop


} // main
+---------+
| return  |
|   from  |
| main    |
+---------+
|hero[99] |
+---------+
|hero[98] |
+---------+
|hero[97] |
+---------+
| ...     |
+---------+
| return  |
|   from  |
| main    |
+---------+
|  k      |
+---------+
|hero[99] |
+---------+
|hero[98] |
+---------+
|hero[97] |
+---------+
| ...     |