sirven que punteros puntero para los lenguaje ejemplos declaracion cadenas aritmetica c++ pointers temporary static-code-analysis cppcheck

c++ - que - ¿Cómo evitar devolver un puntero a una variable temporal?



punteros void lenguaje c (1)

En una búsqueda de errores reciente, encontré un problema al devolver un puntero a un miembro de una variable temporal. El código ofensivo (simplificado) fue:

struct S { S(int i) : i(i) {} int i; int* ptr() { return &i; } }; int* fun(int i) { return S(i).ptr(); } // temporary S dies but pointer lives on int main() { int* p = fun(1); return *p; // undefined }

¿Cómo prevenir esto? GCC y Clang tienen -Waddress-of-temporary y -Wreturn-stack-address pero parecen perder el rastro debido a que ptr() actúa como intermediario para los actos sucios. Solo se activan cuando el puntero se toma directamente:

int* fun(int i) { return &S(i).i; } // rightly fails to compile

Mi proyecto también incorpora cppcheck en integración continua, pero tampoco puede recogerlo (aparece aquí ).

¿Qué herramienta de análisis estático puede prevenir esta clase de errores?

EDITAR: GCC lo recoge desde la versión 6.1.0 con -Wreturn-local-addr y (sorprendentemente) -O2 encendido.


Soy un desarrollador de Cppcheck.

Mi proyecto también incorpora cppcheck en integración continua, pero tampoco puede recogerlo.

error interesante Este es el tipo de error que cppcheck quiere advertir. Tenemos algunos controles relacionados, pero esto se deslizó desafortunadamente.

No es realmente sorprendente dada la naturaleza regex de cppcheck.

Personalmente no entiendo por qué algunas personas dicen que cppcheck es una herramienta de expresiones regulares.

Utiliza AST, análisis de flujo de valor sensible al contexto, etc. para detectar errores. Lo mismo hacen GCC y Clang. Algunas veces se afirma que Cppcheck es una herramienta de expresiones regulares, pero GCC y Clang no lo son.