clang - meaning - sonarqube tutorial
¿Cómo hacer un seguimiento de una variable con el analizador estático de Clang? (1)
Creo que se perdió la verificación de que este evento de llamada es una llamada a su función inc / dec. Deberias tener algo como
void MySimpleChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {
const IdentifierInfo* callee = Call.getCalleeIdentifier();
if (callee->getName().str() == "inc" || callee->getName().str() == "dec")
SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}
Supongamos que estoy trabajando con el siguiente fragmento de C:
void inc(int *num) {*num++;}
void dec(int *num) {*num--;}
void f(int var) {
inc(&var);
dec(&var);
}
Al usar un analizador estático, quiero poder decir si el valor de var no cambió durante la ejecución de la función. Sé que tengo que mantener su estado por mi cuenta (ese es el punto de escribir un verificador de Clang), pero tengo problemas para obtener una referencia única de esta variable.
Por ejemplo: si uso la siguiente API
void MySimpleChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {
SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}
Espero que devuelva un puntero a la representación de este símbolo en el contexto de mi verificador. Sin embargo, siempre obtengo 0 en MyArg usándolo de esta manera. Esto sucede para las funciones inc y dec en las devoluciones de llamada anteriores y posteriores .
¿Que me estoy perdiendo aqui? ¿Qué conceptos me equivoqué?
Nota: Actualmente estoy leyendo el Manual de Internos de Clang CFE y he leído el excelente Cómo escribir un verificador en el material de 24 horas . Todavía no pude encontrar mi respuesta hasta ahora.