Dans clang, comment utilisez-vous par-optimisation de la fonction d'attributs?

Je suis en train de compiler une fonction spécifique avec pas d'optimisation à l'aide de clang, afin d'éviter certaines liées à la sécurité, des appels à memset() d'être optimisé à l'écart.

Selon la documentation peut être trouvée ici, il existe une optnone attribut qui permet cela. Aussi, un exemple peut être trouvé ici.

Malheureusement, (au moins sur le dessous de la version de clang, sur OS X 10.9.5), ce qui provoque des avertissements du compilateur, comme on le voit dans cet exemple:

$ 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.

J'ai aussi essayé d'utiliser #pragma clang optimize off, mais cela a provoqué une unknown pragma ignored avertissement.

Personne ne sait pourquoi ce n'est pas de travail? Ai-je raté une condition préalable pour l'utilisation de cette fonctionnalité? (J'ai aussi essayé d'utiliser différents -std= paramètres, y compris c11, gnu11, c99, et gnu99, mais rien n'a changé le comportement.)

  • ici
  • savez-vous quelle est la version de clang qui est? J'ai remarqué qu'il est appelé via clang++. J'ai essayé ça aussi, mais pas de changement dans mes résultats.
  • Il ressemble à cela ne fonctionne pas avec Apple clang ou llvm-gcc - déposer un rapport de bug.
  • clang version 3.5.0 (tags/RELEASE_350/final 217394)
  • merci; déposé.
  • Cette question a un grave XY problème va sur. La désactivation de l'optimisation n'est pas une méthode valable pour s'assurer que les données sensibles ne reste pas dans la mémoire. Si c'est ce que vous voulez faire, vous devez poster une nouvelle question à ce sujet (ou de rechercher une réponse). C'est intéressant (et beaucoup plus difficile qu'il n'y paraît!) problème, et les réponses ne doivent pas être enterrés dans une autre question de ce genre.
  • Je suis en désaccord; c'est une question à propos de l'utilisation d'un compilateur fonction afin de travailler autour de ce qui est sans doute un bug du compilateur. Il est exact que si oui ou non un memset()construire est suffisant doit être une question distincte, mais dans ce cas, il répond à l'exigence. Tous les autres plate-forme se comporte correctement lorsqu'un compilateur spécifique de l'attribut est utilisé pour activer l'optimisation off. (bien que valider le fait qu'elle répond à l'exigence n'est pas facile!)

InformationsquelleAutor mpontillo | 2014-10-08