Encuentre llamadas a funciones escritas que no verifiquen el valor de retorno

Quiero una herramienta para analizar C / C ++ (otros son bienvenidos, particularmente PHP, pero C / C ++ == prioridad) y encontrar llamadas a funciones escritas que no verifican el valor de retorno.

No veo una opción g ++ (MS tiene esa opción).

¿ Quizás algo como Férula ? ¿O hay un IDE que me permita verificar esto? Las soluciones GUI y CLI son bienvenidas.

Preferiblemente Linux, pero Windows es aceptable.

Debe ser gratis.

¿Algunas ideas?

¿A qué te refieres con comprobar el valor de retorno? ¿Usarlo en un predicado? ¿Cuál es el caso de uso para esto?
Quiero decir que una función devuelve un valor, digamos éxito/fallo y la persona que llama no se molesta en verificar ese valor y actuar en consecuencia (solo asume el éxito)
Luego insistes en que el resultado se use en un predicado. ¿Por qué la respuesta de Steve es la "correcta" en ese caso?
Es con lo que fui. Siéntase libre de publicar otra respuesta. Retrocedería la respuesta si su publicación ofreciera una mejor solución.
Se supone que la SR se trata de buenas recomendaciones que coincidan con los requisitos. No creo que su elección coincida con los requisitos que ha indicado. No, no tengo otra respuesta con las limitaciones que has indicado.
Entonces, ¿por favor ayúdame a entender? ¿Debería dejarlo sin respuesta? Tal vez eso ayudaría a otros en el futuro. Tal como está, siento que esto responde a mi pregunta: ¿qué te hace pensar que no es así? Creo que podría aprender algo aquí. Gracias, Steve.
¿Cómo puede ser una respuesta una respuesta que no cumple con su requisito de "verifica el valor de retorno"? Sí, lo habría dejado marcado como sin respuesta. Sí, la respuesta de Steve probablemente sea útil, solo que no está completa con respecto a sus requisitos, por lo que no la eliminaría ni la rechazaría.
Lo siento, Ira, debo ser totalmente tonto, pero no entiendo por completo tu punto. Estaba leyendo el código, encontré muchos lugares donde no se verificó un valor de retorno, por ejemplo, una llamada malloc()y el código continuó como si fuera exitoso. En mi opinión, la sugerencia de Steve me ayuda a detectar eso, como en el código de muestra que publiqué como respuesta. Tengo la horrible sensación de que estamos "hablando entre nosotros". ¿Qué me estoy perdiendo?
¿Quizás no entiendes la palabra "predicado"? Su solicitud parece ser una herramienta que verifica una función de retorno de valor foo, que cada uso de foo es equivalente al siguiente código: [[x=foo(...); ... si (...x...) ... ]] donde ... significa "código arbitrario que no afecta a x". La respuesta de Steve en el mejor de los casos maneja la detección de que cada uso de foo es equivalente a [[x=foo(...);]]; no se requiere prueba de x. Esos me parecen bastante diferentes.
Lo veo ahora, lamento haber sido tan oscuro. tal vez un buen linter ayude. La respuesta de Steve ciertamente ayuda un poco y, en la práctica, aún no he encontrado un caso en el x = foo()que x no se pruebe durante la revisión del código (pero es el tipo de código en el que no me sorprendería ver eso, por desgracia: - (Gracias por aclarar eso. Dejaré a Steve con la respuesta hasta que surja algo mejor.
Todo lo que hará es desanimar a la persona con la respuesta correcta para que no la proporcione; después de todo, ya has elegido el equivocado. (Esto no pretende ser "en contra" de Steve, solo en contra de marcar la respuesta incorrecta).
OK estoy de acuerdo. Dado que @Steve tiene 10.5k, no creo que se moleste mucho si no doy la respuesta ,-) Veamos si alguien tiene una mejor respuesta. Estoy bastante sorprendido de que nadie haya mencionado un linter todavía.

Respuestas (2)

En gcctienes las siguientes opciones:

-Wunused-result Advierte si el valor devuelto no se usa -Wunused advierte sobre una cantidad de casos no utilizados y -Wall(mi favorito) activa un montón de advertencias, incluido -Wunused-result

Puede encontrar una lista completa de las opciones de advertencia de gcc aquí .

También puede usar atributos de función para configurarlos warn_unused_resulty generar una advertencia si no se usa un valor de retorno de funciones específicas.

Y por supuesto gcces gratis.

No sé cómo me perdí eso. ¿También para g++? Solo -Wunused-resul o necesito agregar __attribute__((warn_unused_result a la declaración de la función ecey?
Simplemente lo intentaría: la mayoría de las banderas de gcc también se aplican a g ++
Estoy publicando una respuesta, porque no puedo formatear el código en un comentario. Obviamente, sin embargo, le estoy otorgando la respuesta y un voto a favor y mi agradecimiento.
"Sin usar" ciertamente implica "no marcado", pero parece solo un pequeño subconjunto.

Extrañamente, ni -Wunused-result ni -Wall funcionaron en g++ v4.6.3. Sin embargo, el atributo de función que sugirió Steve sí lo hizo.

int GenerateRandomNumber() __attribute__((warn_unused_result));

int GenerateRandomNumber()
{
   return 4;
}

int main()
{
    GenerateRandomNumber();

    return 0;
}

da como resultado

**** Compilación de la configuración Debug para el proyecto unused_return_value ****

haga todo el archivo de construcción: ../src/unused_return_value.cpp Invocando: GCC C++ Compiler g++ -O0 -g3 -pedantic -Wall -c -fmessage-length=0 -Wunused-result -MMD -MP -MF"src/unused_return_value. d" -MT"src/unused_return_value.d" -o "src/unused_return_value.o" "../src/unused_return_value.cpp" ../src/unused_return_value.cpp: En la función 'int main()': .. /src/unused_return_value.cpp:10:24: warning: ignoring return value of ‘int GenerateRandomNumber()’, declared with attribute warn_unused_result[-Wunused-result] Construcción finalizada: ../src/unused_return_value.cpp Destino de construcción: unused_return_value Invocando: GCC C++ Linker g++ -o "unused_return_value" ./src/unused_return_value.o Objetivo de construcción terminado: unused_return_value

**** Construcción terminada ****

Podría envolver el atributo en un #define.

También estoy presionando fuertemente para usar la opción "tratar las advertencias como errores". Creo firmemente que cualquiera que pueda crear un compilador sabe más sobre el idioma que yo (tuve problemas con el Libro del dragón), por lo que nunca puedo entender cuando la gente se encoge de hombros y dice "es solo una advertencia".

También presionaré para usar un Linter. Y para que el código esté libre de advertencias de compilador y linter antes de la revisión del código (los resultados de ambos se enviarán con el código) y antes del lanzamiento al control de versiones.

¡Gracias, Steve!

Mawg: personalmente diría que bloquear a las personas para que no pongan las cosas bajo el control de versiones porque todavía tienen advertencias / fallas de pelusa no es la mejor manera de hacerlo, ya que puede resultar en que las personas no usen el control de versiones; manténgalos en una rama hasta que se cumplan los criterios de calidad. reunirse y luego permitir que entren en el baúl podría ser una mejor manera de hacerlo.