Pourquoi l'exécution de code Java dans les commentaires avec certains caractères Unicode-ils autorisés?

Le code suivant génère la sortie "Bonjour le Monde!" (non, vraiment, essayez).

public static void main(String... args) {

   //The comment below is not a typo.
   //\u000d System.out.println("Hello World!");
}

La raison pour cela est que le compilateur Java analyse le caractère Unicode \u000d comme une nouvelle ligne et se transforme en:

public static void main(String... args) {

   //The comment below is not a typo.
   //
   System.out.println("Hello World!");
}

Résultant ainsi en un commentaire d'être "exécuté".

Car il peut être utilisé pour "masquer" le code malveillant ou que ce soit un mauvais programmeur la possibilité de concevoir, pourquoi est-il permis, dans les commentaires?

Pourquoi est-ce autorisé par les spécifications de Java?

  • "Pourquoi est-ce autorisé" semble être trop opinion de moi. La langue concepteurs pris une décision, quoi d'autre est-il besoin de le savoir? Sauf si vous trouvez une déclaration de la personne qui fait de cette décision, nous ne pouvons que spéculer.
  • Bien qu'étrange, je ne vois pas cela comme un problème réel. Les utilisateurs normaux ne savent pas la différence entre le code caché dans un commentaire et régulière code pour eux, il n'a pas d'importance. Ensuite, il pourrait être un membre de l'équipe de cacher le code des autres membres, mais les développeurs vont réagir en voyant un étrange commentaire comme celui-ci, et de le supprimer ou étudier. Si c'était pour passer à travers et mis en usage, un VCS va vous dire la personne qui l'a fait, donc on peut attraper.
  • \u000d signifie ASCII 0x0D, \n, New Line
  • Une chose intéressante, c'est au moins que OP IDE évidemment est faux et affiche une coloration incorrecte,
  • C'est expliqué dans la question. L'OP est de se demander pourquoi dans la section des commentaires, il est également traduite \n.
  • Peut-être liés: stackoverflow.com/questions/4448180/...
  • Oui, la réponse faisant autorité ne peut venir que de créateurs. Cependant, il peut y avoir de l'information quelque part sur pourquoi cela a été fait (compatibilité, la limitation des outils, etc.), donc il est responsable.
  • cela ne convient pas pour une bonne cause ou pour une question comme par AFIN de normes.Si vous voyez de près le 1er vote de proximité a été fait par tjcrowder qui est d'avoir 360,349 reps
  • 'cause caractère de saut de ligne est également autorisé ... je l'avais testé avec c++ et c#, ces langues sont skiping les lignes après la lecture de // mais java semble analyse la ligne complète et interpréter le code de saut de ligne char.
  • Mais les concepteurs de Java visitez DONC il est donc possible d'obtenir des réponses par l'un d'eux. Ils peuvent aussi existent des ressources qui déjà répondre à cette question.
  • Je ne sais pas pour vous, mais je soupçonne que c'est juste un effet secondaire de la décision générale pour traiter unidoce caractères à l'intérieur de commentaires. Peut-être afin de permettre les commentaires de code en langues étrangères, ou avec de la mathématique grecque signes. Personnellement, je préfère l'éviter... (javadoc peut-être une exception, mais ensuite je n'ai pas besoin de cette fonction parce que le HTML a son propre support pour les caractères spéciaux).
  • stackoverflow.com/questions/3866187/... exemple amusant
  • Unicode d'échappement partout et sont toujours analysées avant tout le reste. L'intention est que tout fichier source peut être converti en équivalent fichier contenant uniquement des caractères ASCII.
  • Connexes: stackoverflow.com/q/13116648/319403
  • C'est également affiché comme un commentaire dans Eclipse, donc, connaissez-vous une IDE qui n' pas l'afficher comme un commentaire?
  • Netbeans (au moins dans la version 8.0.2) se termine le commentaire après l'echappé Unicode retour à la ligne, montrant la println() comme du code. Il montre également le même comportement que le compilateur pour l'échappé de début de commentaire le code de stackoverflow.com/questions/4448180/...
  • Cela signifie également que les invalides Unicode s'échappe dans les commentaires de provoquer des erreurs de compilation (comme un chemin d'accès windows continue \users), ce qui peut être gênant.
  • Les OP n'ont pas fait mention de son IDE affiche que le code. La seule chose, en soulignant que nous pouvons dire à partir de texte de la question est que le code Java surligneur ici, DONC s'il se trompe.
  • Ce que vous montrez est un bug dans l'IDE. Il est parfaitement valable code. Que l'IDE ne pas MONTRER que le code est le bug. IDEs faut arrêter de croire les compilateurs ne sont pas conscients de l'unicode.
  • ce qui fait de vous tirer la conclusion que c'est un bug dans l'OP de l'IDE? (Comment savez-vous OP est d'utiliser un IDE?)
  • La réponse simple est que le code n'est pas dans un commentaire à tous, par les règles de la langue, de sorte que la question est mal formé.
  • Eclipse Luna se termine le commentaire après l'unicoded retour chariot. Son comportement par défaut est de "résoudre" le caractère unicode lors de l'enregistrement du document, de sorte que tout le code écrit dans un commentaire après une unicode retour chariot sera fait de montrer à l'extérieur de la ligne de commentaire.
  • peut-être en utilisant le terme IDE est présomptueux. L'erreur est dans l'éditeur/IDE/ou de la perception de l'utilisateur de la "ligne" et "déclaration". La perception de l'utilisateur d'un relevé actif peut être considérablement améliorée par l'utilisation d'une syntaxe conscient de l'éditeur. Si la syntaxe de conscience de l'éditeur de ne pas gérer correctement un aspect de la prise en charge syntaxe du langage, l'outil est dans l'erreur, vis-a-vis, c'est un bug.
  • C'est DONC de la coloration syntaxique, bien sûr, ne sait pas qu'elle ne traite qu'avec Java. C'est un "jack of all trades", et il est lié à la promenade sur le bord des cas.
  • Avoir une quantité massive de rep comme ça ne signifie pas qu'ils ont un avis autorisé que tout le monde devrait suivre. Bien que le libellé de la question qui peut changer (le"pourquoi" est très opiniâtre) je pense que c'est vraiment un très bon sujet, et je suis très content que ça été apportée jusqu'ici.
  • Un raisonnablement intelligent malfaiteur aurait assurez-vous qu'il ressemblait à une partie du commentaire. Ne devrait pas être difficile de le faire paraître innocent.
  • En supposant que ce n'est pas un bug du compilateur, je dirais que c'est une grave et choquant faille dans la spec. Employés malveillants existent, et ils sont assez dangereux sans la langue en les aidant à ce point.
  • Vous pouvez réellement commentaire de l'ensemble de la classe avec ce truc et il fonctionne toujours!
  • La question du titre semble être faux pour moi. L' \u000d personnage est dans ce cas de résiliation du commentaire, donc le code n'est pas dans un commentaire à tous. C'est aussi absurde que de demander ton le compilateur analyse le caractère de saut de ligne à la fin du commentaire, plutôt que d'aller à l'infini. En fin de compte ce défaut provient du défaut inhérent de faire des commentaires de la ligne de base dans un non la ligne de base de la langue.
  • C'est l'ensemble de la prémisse de la question, n'est-ce pas?
  • Shameless plug: Vous pouvez jouer avec cela à l': obfuscat.ion.la terre
  • \u000d est le retour chariot; \u000a serait le retour à la ligne. L'un d'eux termine le // commentaire.
  • Double Possible de unicode caractère de saut de ligne(\u000d) en Java
  • Je vais voter pour fermer cette question hors-sujet, car la question est sur la langue, de la conception, pas de programmation à proprement parler.
  • Je vais voter pour fermer cette question hors-sujet, car l'erreur ne peut pas être recréé. Le code n'est pas un commentaire, cependant, l'IDE de l'OP choses, il est, mais que c'est un bug dans l'IDE et a peu à voir avec le fait que vous pouvez exécuter du code dans un commentaire
  • Pourquoi le compilateur accepte \u-séquences à l'extérieur de la chaîne/les chaînes de caractères? Ainsi, au premier coup d'œil, il semblait être une bonne idée. Avec le recul, nous pouvons dire qu'il n'était pas une bonne idée, mais il est trop tard. (Remarque: il existe de nombreuses mentions de "IDE" dans les commentaires, mais la question n'a rien à voir avec une quelconque "IDE".)
  • Le point de permettre à de code UTF-16 unité s'échappe est de soutenir tous les valide Java identificateurs (esp. les noms de classe) dans un fichier source avec un encodage de caractère qui ne l'est pas.

InformationsquelleAutor Reg | 2015-06-09