Lo que estoy tratando de hacer es encontrar todos los moldes explícitos de tipo double o float a cualquier otro tipo en algunos archivos fuente que tengo. ¿Hay una forma incorporada de gcc para hacer esto? Idioma es C. ¡Gracias!¿Hay alguna forma de obtener gcc o clang para avisar en lanzamientos explícitos?
Respuesta
Desde moldes son explícitamente legal y la forma correcta de realizar las conversiones de extraños, es muy poco probable que gcc contendría una opción para advertir sobre ellos
En cambio, dependiendo de lo grande que su fuente es, es posible que pueda para salirse con la suya:
grep '\(double|float\) ' *
para darle todas las variables dobles o float. Como c no es un lenguaje regular, no es trivial (con herramientas de shell) analizar esto en una lista de variables dobles o float, pero si su fuente es lo suficientemente pequeña, hacerlo a mano es fácil.
grep '([^()]*)[()]*\(your list of variable names\)' *
Desde allí le mostrarán muchos de sus moldes.
-Wconversion
advierten para conversiones implícitas que pueden alterar un valor (double
son grandes tipos), y -Wno-sign-conversion
advertencias deshabilitar sobre conversiones entre números enteros con y sin signo (lo que no habría advertencias menos innecesarios). Cosa que no veo ninguna alternativa estándar ...
peor de los casos se puede buscar las palabras clave directamente en los archivos de origen ...
Por lo que entiendo, las conversiones explícitas no serán capturadas por -Wconversion, de hecho, son una forma de deshacerse de las advertencias. Hice un par de pruebas y descubrí que esto también es cierto, así que tengo que buscar otra forma de hacerlo. – Chris
Desafortunadamente, se muestran (al menos cuando lo intenté hace un par de meses). Había habilitado '-Wconversion' para capturar _accidential_ conversiones, y la cantidad de ruido generado por conversiones explícitas (y previstas) era insoportable. – Damon
Bueno, yo creo que no hay tal opción. Después de todo, el compilador emite una advertencia para advertirle de cosas que podría haber hecho involuntariamente. Un lanzamiento explícito, sin embargo, es básicamente una forma de decirle a tu compilador "Cállate, sé lo que estoy haciendo".
No es para flotar o para doblar lo que me preocupa, es de flotar y doblarse a cualquier otra cosa. Creé una lista para todos los lanzamientos, pero necesito extraer los nombres de variables de esa lista que son solo flotantes o dobles, lo que me resulta muy difícil de hacer. – Chris
¿Qué tipo de molde es problemático aquí? Si son problemáticos, ¿por qué terminaron en el código en primer lugar? –
@cli_hlt: Existe un código incorrecto, ya sabes, que debe corregirse al mejor :) –
Si su código C también se puede compilar en modo C++, puede usar el indicador de advertencia -Wold-style-cast
de g ++ para activar una advertencia en todos los lanzamientos.
Puede determinar si Clang tiene alguna advertencia que activará un patrón de codificación particular al usar su interruptor -Weverything
(pero tenga en cuenta que esto no es útil para casi cualquier otro propósito: clang tiene advertencias deshabilitadas por defecto que desencadenan en varias formas de código legítimo). Sin embargo, en este caso, clang no tiene ninguna advertencia que se active en dichos lanzamientos.
Mientras que los compiladores que conozco no tienen opciones para que, FlexeLint de Gimpel puede hacer lo que quiera:
$ cat tst.c
int main (void)
{
int i = 0, j = 0;
float f = 0.0;
double d = 0.0;
i = (int) f;
j = (int) d;
d = (double) f;
f = (float) d;
i = (int)j;
j = (unsigned) i;
return (int) j;
}
$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012
--- Module: tst.c (C)
_
i = (int) f;
tst.c 7 Note 922: cast from float to int
_
j = (int) d;
tst.c 8 Note 922: cast from double to int
_
d = (double) f;
tst.c 9 Note 922: cast from float to double
_
f = (float) d;
tst.c 10 Note 922: cast from double to float
shell returned 4
- 1. ¿Debo usar "#pragma GCC ..." o "#pragma clang ..." en Xcode
- 2. ¿Hay alguna forma en Grails de obtener todo el registro?
- 3. Forzar GVim para avisar antes de cerrar
- 4. ¿Hay alguna forma de hacer bitwise-O enumeraciones en Java?
- 5. ¿hay alguna forma de obtener componentes individuales de heroku toolbelt?
- 6. ¿Hay alguna forma de obtener XML de elemento por atributo?
- 7. Xcode 3.2.1 GCC CLANG y LLVM desmitificación
- 8. gcc vs. clang: extracción de símbolos
- 9. ¿Hay alguna forma de obtener una dirección de referencia?
- 10. ¿Hay alguna forma de obtener la dirección de un registro?
- 11. ¿Hay alguna forma de comparar dos diffs o parches?
- 12. ¿Hay un envoltorio de Python Clang en la línea de pygccxml que envuelve GCC-XML?
- 13. llvm-clang: analizador incremental o en línea?
- 14. ¿Hay alguna forma de sobrecargar + = en python?
- 15. ¿Hay alguna forma de C para obtener el número de artículo de enum en java?
- 16. ¿Hay alguna forma de vincular Keyboard.FocusedElement?
- 17. ¿Hay alguna forma en que CMake requiera la versión 4+ de GCC?
- 18. ¿Hay alguna forma de currying en C?
- 19. ¿Hay alguna forma (distinta de sql) de obtener el mlid para un nid determinado en drupal?
- 20. ¿Hay alguna forma de multirreproducir un SqlDataReader?
- 21. ¿Ilvm-gcc y clang binary son compatibles con gcc? - particularmente mingw gcc en Windows
- 22. ¿Hay alguna manera de usar fopen_s() con GCC o al menos crear un #define al respecto?
- 23. ¿Hay alguna forma de comprobar si la opción "Instalar desde origen desconocido" está habilitada en Android?
- 24. ¿Hay alguna forma incorporada para obtener la longitud de un iterable en python?
- 25. En R6RS Scheme, ¿hay alguna forma de obtener el entorno actual para usar con eval?
- 26. ¿Hay alguna forma de obtener stacktraces para todos los hilos en C#, como java.lang.Thread.getAllStackTraces()?
- 27. ¿hay alguna manera de usar C++ 0x en xcode? Quiero usar gcc 4.4 o superior
- 28. ¿Hay alguna forma de pasar el contexto para vincular jQuery?
- 29. ¿Hay alguna forma de generar código repetitivo para pilas RESTful?
- 30. ¿Hay alguna forma RESTful de configurar rutas para habtm?
Tal vez estoy siendo simple, pero no podía que acaba de buscar '(doble) 'o' (float) 'en su fuente? –
@RobertHarvey Lo siento, lo reformulé para que tenga más sentido. Quiero capturar todos los moldes explícitos que sean de tipo float/double a cualquier otra cosa, así que puedo buscar (int), etc. pero no podría decir si son float o double. – Chris
Solo una idea (no sé C++ o si es posible): anular el operador de conversión para doblar y flotar para emitir un error de compilación y compilar como C++ :) – pmg