É seguro converter um ponteiro alocado de pilha em um ponteiro para um VLA?

Se eu tenho um ponteiro para algum espaço alocado de pilha que representa uma matriz bidimensional típica de linha principal, é seguro converter esse ponteiro em um ponteiro equivalente a um VLA para sub-script conveniente? Exemplo:

//
// Assuming 'm' was allocated and initialized something like:
//
// int *matrix = malloc(sizeof(*matrix) * rows * cols);
//
// for (int r = 0; r < rows; r++) {
//     for (int c = 0; c < cols; c++) {
//         matrix[r * cols + c] = some_value;
//     }
// }
//
// Is it safe for this function to cast 'm' to a pointer to a VLA?
//
void print_matrix(int *m, int rows, int cols) {
    int (*mp)[cols] = (int (*)[cols])m;

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            printf(" %d", mp[r][c]);
        }
        printf("\n");
    }
}

Eu testei o código acima. Parece funcionar, e faz sentido para mim que funcione, mas é um comportamento seguro e definido?

Caso alguém esteja se perguntando, o caso de uso aqui é que estou recebendo dados de um arquivo / soquete / etc que representa uma matriz 2D (ou 3D) principal da linha e gostaria de usar VLAs para evitar o cálculo manual de índices para o elementos.

questionAnswers(1)

yourAnswerToTheQuestion