C локальный массив не освобождается при использовании goto - PullRequest
1 голос
/ 29 марта 2020

Не уверен, что я что-то упускаю из-за использования goto:

Это не работает, заканчивается segfault:

for(long i = 0; i < 1000000000; i++) {
    LABEL_1: {
        int test[10];

        goto LABEL_2;
    }

    LABEL_2: {
        int test[10];
    }
}

Тогда как это работает:

for(long i = 0; i < 1000000000; i++) {
    LABEL_1: {
        {               // Note this extra block
           int test[10];
        }

        goto LABEL_2;
    }

    LABEL_2: {
        int test[10];
    }
}

Эти примеры не вызывают проблему, но представляют то, что происходит в моем коде.

Это упрощенный пример того, что происходит в https://github.com/risotto/risotto/tree/feature/direct-threading-2

См. https://github.com/risotto/risotto/blob/feature/direct-threading-2/src/lib/vm/vm.c#L332 и https://github.com/risotto/risotto/blob/feature/direct-threading-2/src/lib/vm/vm.c#L257

Из моего репо это работает:

        case TARGET(OP_RETURN):
        {
                FunctionCall fc = vec_pop(&vm.fcs);
                int rc = fc.retc;

            {
                Value rvals[rc];
                for (int i = rc - 1; i >= 0; --i) {
                    rvals[i] = copy(pop());
                }

                vm.ip = fc.ip;
                vm.sp = fc.sp;
                vm.fp = fc.fp;

                vm.sp -= fc.argc;

                pushm(rvals, rc);
            }
            NEXT();
        }

Это не так:

        case TARGET(OP_RETURN):
        {
                FunctionCall fc = vec_pop(&vm.fcs);
                int rc = fc.retc;

                Value rvals[rc];
            {
                for (int i = rc - 1; i >= 0; --i) {
                    rvals[i] = copy(pop());
                }

                vm.ip = fc.ip;
                vm.sp = fc.sp;
                vm.fp = fc.fp;

                vm.sp -= fc.argc;

                pushm(rvals, rc);
            }
            NEXT();
        }

Это скомпилировано через g cc GNU 7 и использует вычисленное goto внутри NEXT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...