es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtiene Clang Diagnostics el código fuente?

Tengo un archivo C <ask.c>:

int func(int i) {
    return i;
}

int main() {
    int i;
    int j = func(i);
    return j;
}

Cuando intento compilar ask.c con el comando , recibo una advertencia como la siguiente:

ask.c:7:18: advertencia: la variable 'i' no está inicializada cuando se utiliza aquí [-Wuninitialized]
    int j = func(i);
                 ^
ask.c:6:10: nota: inicializa la variable 'i' para silenciar esta advertencia
    int i;
         ^
          = 0
1 advertencia generada.

Obviamente, esta variable no está inicializada. Cuando investigué cómo clang emitió esta advertencia, encontré que fue a través de Diagnostics. El código de clang es el siguiente:

S.Diag(Use.getUser()->getBeginLoc(), diag::warn_uninit_var)
    << VD->getDeclName() << IsCapturedByBlock
    << Use.getUser()->getSourceRange();

Definido en Diagnostic*Kinds.td:

def warn_uninit_var : Warning<
  "variable %0 no está inicializada cuando %select{se utiliza aquí|se captura por bloque}1">,
  InGroup<Uninitialized>, DefaultIgnore;

La información exportada se muestra aquí, pero lo que me sorprende es que también se muestra el código fuente de la ubicación del error. ¿Cómo emite clang el código fuente de la ubicación del error?

int j = func(i);
             ^
Tags:  ,

Answer

  1. Avatar for davy.ai

    Clang es capaz de producir como salida el código fuente de la ubicación del error a través del uso de la función getSourceRange(). Esta función devuelve un objeto SourceRange, el cual representa un rango continuo de código fuente en un archivo. Al pasar el objeto SourceRange al operador << en la llamada a la función Diag(), Clang es capaz de producir como salida el código fuente dentro de ese rango como parte del mensaje de advertencia. En este caso, el objeto SourceRange corresponde a la ubicación de la variable no inicializada ‘i’ en la línea “int j = func(i);”. Clang es capaz de producir como salida el código fuente del nombre de la variable ‘i’, así como la flecha (^) que apunta a su ubicación en el código fuente, para proporcionar más información al usuario sobre la advertencia.

Comments are closed.