Булевая функция без return'a возвращает корректное значение

Работаю в QT 6.2 Есть у меня программа, что считает площадь произвольного простого многоугольника. Перед расчётом площади, я проверяю многоугольник на пересечение сторон.

if(!cross(polygon, n))
{
    double S = square(polygon,n);
    if(!(qIsInf(S)))
    {
        ui->l_Sq->setText("Площадь: " + QString::number(S));
    }
    else
    {
        warning("Многоугольник слишком большой(");
    }
}
else
{
    warning("Я умею работать только с простыми многоугольниками(");
}

Для этого я вызываю булевую ф-цию not_cross()

bool cross(double **polygon, int n = 0) // Ф-ция  проверки на пересечение сторон многоугольника
{
    bool not_cross = true;
    double x1,x2,x3,x4;
    double y1,y2,y3,y4;
    double v1,v2,v3,v4;

    for (int i=0; i<n&&not_cross; i++)
    {
        int k = (i+1)%n;
        x1 = polygon[i][0]; x2 = polygon[k][0];
        y1 = polygon[i][1]; y2 = polygon[k][1];
        for (int j = 0; j<n&&not_cross; j++)
        {
            int m = (i+j)%n;
            int v = (m+1)%n;
            if(abs(i-m) <= 1)
                continue;
            x3 = polygon[m][0]; x4 = polygon[v][0];
            y3 = polygon[m][1]; y4 = polygon[v][1];

            v1 = (x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
            v2 = (x4-x3)*(y2-y3)-(y4-y3)*(x2-x3);
            v3 = (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
            v4 = (x2-x1)*(y4-y1)-(y2-y1)*(x4-x1);

            not_cross = !((v1*v2<0) && (v3*v4<0)) && not_cross;

        }
    }
}

Как можно заметить, в этой ф-ции отсутствует return. Однако она всё ещё возвращает корректные значения. Tо есть, если фигура пересекается, то она вернёт true, если не пересекается -- false Вроде бы, я достаточно раз протестировал работу программы, чтобы исключить совпадения. С чем это связанно? Неужели компилятор сам догадывается вернуть значение not_cross? Хотя если дописать возращение, то придётся написать return !not_cross (Да, я тут нагородил кода. Простите, я писал в спешке)


Ответы (1 шт):

Автор решения: gbg

Формально, функция без return, которая возвращеет не void, другими словами, функция, выполнение которой доходит до последней скобки, не встречая на своем пути return (что-то), вызывает неопределенное поведение.

Неопределенное поведение может быть и таким, какого вы ожидаете, но программа при этом остается некорректной.

→ Ссылка