Estoy tratando de compilar una función específica sin optimización usando clang
para evitar ciertas llamadas relacionadas con la seguridad a memset()
de ser optimizado lejos.
De acuerdo a la documentación que se puede encontrar aquíexiste un optnone
atributo que permite esto. También, Un ejemplo puede ser encontrado aquí.
Desafortunadamente, (al menos en la siguiente versión de clang
en OS X 10.9.5), esto genera advertencias del compilador, como se puede ver en este ejemplo:
$ clang --version
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
$ cat optnone.c
#include <string.h>
__attribute__((optnone)) void*
always_memset(void *b, int c, size_t len)
{
return memset(b, c, len);
}
$ clang -Wall -O3 -c -o optnone.o optnone.c
optnone.c:3:16: warning: unknown attribute 'optnone' ignored [-Wattributes]
__attribute__((optnone)) void*
^
1 warning generated.
También probé usando #pragma clang optimize off
pero esto provocó un unknown pragma ignored
advertencia.
¿Alguien sabe por qué esto no funciona? ¿Me perdí un requisito previo para usar esta función? (También intenté usar varios diferentes -std=
parámetros, incluyendo c11
, gnu11
, c99
y gnu99
pero nada cambió el comportamiento.)
trabaja aquí
–Bryan Chen
08/10/2014 a las 21:37
@BryanChen, ¿sabes qué versión de clang es esa? Me di cuenta de que está siendo llamado a través de
clang++
. Lo intenté también, pero no hubo cambios en mis resultados.– mpontillo
08/10/2014 a las 21:40
Parece que esto no funciona con el sonido metálico de Apple o llvm-gcc – presentar un informe de error.
– Pablo R.
08/10/2014 a las 21:42
clang versión 3.5.0 (etiquetas/RELEASE_350/final 217394)
–Bryan Chen
8 oct 2014 a las 21:43
@R.., no estoy de acuerdo; esta es una pregunta sobre cómo usar una característica particular del compilador para evitar lo que es posiblemente un error del compilador. Tienes razón en que sea o no un
memset()
-como construcción es suficiente debería ser una pregunta separada, pero en este caso cumple con el requisito. Todas las demás plataformas se comportan correctamente cuando se usa un atributo específico del compilador para desactivar la optimización. (¡aunque validar que cumple con el requisito no es fácil!)– mpontillo
9 oct 2014 a las 5:05