潜在的未初始化的本地指针变量' playtimer'用过的

时间:2016-03-14 16:28:49

标签: c++ visual-c++

int main(int argc, char* argv[])
{
    char str[256];
    FILE *fp = NULL;
    int h[3];
    SDL_TimerID playtimer, fpstimer;

    if (!init())
        return 1;

    if (argc>1) {
        if (!strcmp(argv[1],"-l") && (argc==3)) {
            mode = PLAY;
            if (!viewer->open(argv[2])) {
                error("Unable to load data file\n");
                exit(1);
            }
        } else if (!strcmp(argv[1], "-w") && (argc==3)) {
            mode = SIMULATE;
            fp = fopen(argv[2], "wb");
            fwrite(h, sizeof(int), 3, fp);
        } else {
            printf("Invalid command line argument. Usage: fluid [-l|-w <filename>]\n");
            exit(1);
        }
    } else {
        mode = SIMULATE;
    }

    if (mode == SIMULATE)
        simthread = SDL_CreateThread(simulate, NULL);

    if (mode == PLAY)
        playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);

    fpstimer = SDL_AddTimer(1000, showfps, NULL);
    EventLoop(fp);
    SDL_RemoveTimer(fpstimer);
    if (mode==PLAY)
        SDL_RemoveTimer(playtimer);

    if (mode == SIMULATE) {
        quitting = true;
        SDL_WaitThread(simthread, NULL);
    }

    if (fp && (mode == SIMULATE)) {
        int pos;
        h[0] = h[1] = N+2;
        h[2] = simframes;
        pos = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        fwrite(h, sizeof(int), 3, fp);
        fclose(fp);
        printf("%d frames written to file %s, %d kiB\n", simframes, argv[2], pos>>10);
    }
你可以帮我解决这个问题吗?提前谢谢。

以上是我的代码。错误和警告如下:

  

警告C4101:&#39; str&#39; :未引用的局部变量 -

     

警告C4715:&#39; SDL_main&#39; :并非所有控制路径都返回值 -

     

错误C4703:可能未初始化的本地指针变量   &#39; playtimer&#39;使用

1 个答案:

答案 0 :(得分:2)

您初始化playtimer的唯一位置是

if (mode == PLAY)
    playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);

这是一个条件初始化,意味着playtimer可能会或可能不会在以下代码中初始化。那你有

if (mode==PLAY)
    SDL_RemoveTimer(playtimer);

因此,如果您到达SDL_RemoveTimer(playtimer); playtimer,可能会因为第一个if语句而初始化。现在我们可以推断,因为如果条件具有相同的条件,那么必须初始化playtimer并且我们没问题。不幸的是,试图让编译器看到这是非常困难的,并且很可能是编译器供应商选择不实现的东西。此外,如果这是一个多线程程序mode可能会在两个if语句之间发生变化,并且编译器将无法对其进行分析。

我建议你将两个语句组合成一个if块,以保证playtimer在使用时被初始化:

if (mode == PLAY)
{
    playtimer = SDL_AddTimer(1000/16, timer_proc, NULL);
    SDL_RemoveTimer(playtimer);
}

我还建议你对simthread做同样的事情。