Kompilierungsfehler: verirrtes ‘\302’ im Programm usw

Lesezeit: 6 Minuten

Benutzeravatar von Ahmed Taher
Ahmed Taher

Ich habe ein Problem beim Kompilieren des folgenden Exploit-Codes:

http://downloads.securityfocus.com/vulnerabilities/exploits/59846-1.c

ich benutze “gcc-Datei.c” und “gcc -O2 Datei.c”aber beide führen zu den folgenden Fehlern:

sorbolinux-exec.c: In function ‘sc’:
sorbolinux-exec.c:76: error: stray ‘\302’ in program
sorbolinux-exec.c:76: error: stray ‘\244’ in program
sorbolinux-exec.c:76: error: ‘t’ undeclared (first use in this function)
sorbolinux-exec.c:76: error: (Each undeclared identifier is reported only  once
sorbolinux-exec.c:76: error: for each function it appears in.)

Ich habe versucht, sie auf beiden zu kompilieren Kali-Linux und Ubuntu 10.04 (Lucid Lynx) und bekam das gleiche Ergebnis.

  • Klingt für mich so, als ob Ihre Dateien “nationale” Zeichen enthalten, die in Kennungen oder dergleichen nicht zulässig sind. Aber Sie sollten wirklich die Zeilen in Ihre Frage aufnehmen, die diese Fehler erhalten.

    – Heiße Licks

    5. Oktober 2013 um 13:29 Uhr

  • Fehlermeldungen sagen alles.

    – Dies

    5. Oktober 2013 um 13:39 Uhr

  • \302\244 ist die oktale Darstellung der UTF-8-Sequenz 0xC2 0xA4, was das Währungszeichen ist: ¤.

    – Kodo

    5. Oktober 2013 um 13:45 Uhr

  • Diese Frage ist die kanonisch Frage zu den Problemen mit Streuzeichen, die häufig beim Kopieren und Einfügen von Code von Webseiten, PDF-Dokumenten oder über Chat (z. B. Skype-Chat oder Facebook Messenger). Daher verdient es umfassende Antworten. Zur Zeit, nur Die Antwort von twitchdotcom slash KANJICODER passt zu dieser Rechnung.

    – Peter Mortensen

    5. März 2021 um 5:10 Uhr

  • Eine häufige ist streunend ‘\342’ ‘\200’ ‘\213’ (Oktalzahlen – UTF-8-Bytesequenz 0xE2 0x80 0x8B, Unicode-Codepunkt U+200B (NULL BREITE RAUM)). Ein Suchen/Ersetzen im regulären Ausdrucksmodus in Geany zum \x{200B} hat funktioniert.

    – Peter Mortensen

    5. März 2021 um 10:36 Uhr


Sie haben ein ungültiges Zeichen in dieser Zeile. Das habe ich gesehen:

Geben Sie hier die Bildbeschreibung ein

  • danke, aber das entfernt nur 2 Fehlerzeilen und diese Fehler existieren immer noch raw.c: In Funktion ‘sc’: raw.c:76: Fehler: ‘t’ undeclared (erste Verwendung in dieser Funktion) raw.c:76: error: (Jeder nicht deklarierte Bezeichner wird nur einmal gemeldet raw.c:76: error: für jede Funktion, in der er vorkommt.)

    – Ahmed Taher

    5. Oktober 2013 um 13:45 Uhr


  • @AhmedTaher: Der Fix entfernt sicherlich die Fehlermeldungen in Ihrer Frage. Wenn andere Fehler bestehen bleiben, fügen Sie sie bitte Ihrer Frage hinzu.

    – Kodo

    5. Oktober 2013 um 13:47 Uhr

  • Höchstwahrscheinlich die Linie uint64_t *p = (void *) ¤t[i]; geändert werden muss uint64_t *p = (void *) &current[i];. (¤ ist die HTML-Entität für das Währungszeichen.

    – Kodo

    5. Oktober 2013 um 13:50 Uhr


  • Wenn Sie das Währungszeichen aus Ihrem Code entfernen, können diese Fehlermeldungen nicht mehr erzeugt werden. Es ist einfach unmöglich.

    – Kodo

    5. Oktober 2013 um 13:52 Uhr


  • Die eigentliche Erklärung ist, dass Browser früher viel um ihre Fähigkeit konkurrierten, wirklich schlechten HTML-Code mit vielen Fehlern wiederzugeben. Der Browser von OP sah beim Anzeigen des Codebeispiels eine Zeichenfolge, die mit einem kaufmännischen Und begann und mit einem Semikolon endete, die nicht genau mit einer HTML-Entität übereinstimmte, aber nahe daran war, und entschied sich für die Ersetzung, aber auch für die Anzeige der zusätzliche Text … dies war ein HTML-Parsing-Fehler seitens des Browsers, weil er versuchte, zu hilfreich zu sein.

    – Theodor Murdock

    11. Mai 2018 um 18:03 Uhr

Benutzeravatar von Klaus
Klaus

Sie haben ungültige Zeichen in Ihrer Quelle. Wenn Sie keine gültigen Nicht-ASCII-Zeichen in Ihrer Quelle haben, vielleicht in einem String-Literal in doppelten Anführungszeichen, können Sie Ihre Datei einfach wieder in ASCII konvertieren mit:

tr -cd '\11\12\15\40-\176' < old.c > new.c

Die Methode mit iconv stoppt bei falschen Zeichen, was keinen Sinn macht. Die obige Befehlszeile funktioniert mit der Beispieldatei.

Benutzeravatar von KANJICODER
KANJICODER

Sicher, konvertieren Sie die Datei in ASCII und sprengen Sie alle Unicode-Zeichen weg.
Es wird wohl funktionieren… Aber…

  1. Sie werden nicht wissen, was Sie repariert haben.
  2. Außerdem werden alle Unicode-Kommentare zerstört. Beispiel: //: A²+B²=C²
  3. Es könnte möglicherweise die offensichtliche Logik beschädigen und der Code wird immer noch beschädigt, aber die Lösung ist weniger offensichtlich. Zum Beispiel: Eine Zeichenfolge mit „Smart-Quotes“ („&“) oder ein Zeiger mit einem Sternchen voller Breite (*). Jetzt sieht „SOME_THING“ aus wie ein #define (SOME_THING) und *SomeType ist der falsche Typ (SomeType).

Zwei weitere chirurgische Ansätze zur Behebung des Problems:

  1. Wechseln Sie die Schriftart, um das Zeichen zu sehen. (Es könnte in Ihrer aktuellen Schriftart unsichtbar sein)

  2. Reguläre Ausdrücke durchsuchen alle Unicode-Zeichen, die nicht Teil des nicht erweiterten ASCII sind.

    Im Notepad++ Ich kann bis zu FFFF suchen, was mich noch nicht im Stich gelassen hat.

    [\x{80}-\x{FFFF}]

    80 ist hex für 128, das erste erweiterte ASCII-Zeichen.

    Nachdem Sie auf „Weitersuchen“ geklickt und einen scheinbar leeren Bereich markiert haben, können Sie Ihren Suchdialog schließen und drücken Strg + C in die Zwischenablage zu kopieren.

    Fügen Sie dann das Zeichen in ein Unicode-Suchwerkzeug ein. Ich nutze meistens ein Online.
    http://unicode.scarfboy.com/

Beispiel:

Ich hatte irgendwie einen Aufzählungspunkt (•) in meinem Code. Der Unicode-Wert ist 2022 (Hex), aber wenn er vom Compiler als ASCII gelesen wird, erhalten Sie \342 \200 \242 (3 Oktalwerte). Es ist nicht so einfach, jeden Oktalwert in Hex umzuwandeln und sie zusammenzuschlagen. Also “E2 80 A2” ist nicht der hexadezimale Unicode-Punkt in Ihrem Code.

  • Ja, das ist so eine Art umfassend Antwort, die die am höchsten bewertete und akzeptierte Antwort sein sollte.

    – Peter Mortensen

    5. März 2021 um 5:01 Uhr


  • Alternativ suchen/ersetzen Sie nur das anstößige Zeichen. ZB mit \x{200B} (Fehlerstreuung ‘\342’ ‘\200’ ‘\213’). Das hat bei mir funktioniert, nachdem ich den Code von kopiert hatte eine Internetseite.

    – Peter Mortensen

    5. März 2021 um 10:17 Uhr


  • Eine ähnlich umfassende Antwort auf eine ähnliche Frage (für Linux).

    – Peter Mortensen

    6. März 2021 um 2:16 Uhr


  • Suchen Sie hier nach solchen oktalen UTF-8-Codes, um zu sehen, welchen Zeichen sie tatsächlich entsprechen: ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C2%B0&mode=char

    – Markierung

    23. April 2021 um 9:57 Uhr

  • (Die Beispiel-QMK-Webseite ist kaputt gegangen. Alternativer Standort. Aber ich kann das Problem mit dem neuen Speicherort nicht reproduzieren. Vielleicht haben sie zu viele Beschwerden bekommen und es behoben?)

    – Peter Mortensen

    8. März um 0:15


Benutzeravatar von TheMagicCow
Die magische Kuh

Ich habe das gleiche mit einem Zeichen, das sichtbar als Sternchen erschien, aber es war stattdessen eine UTF-8-Sequenz:

Encoder * st;

Beim Kompilieren wurde Folgendes zurückgegeben:

g.c:2:1: error: stray ‘\342’ in program
g.c:2:1: error: stray ‘\210’ in program
g.c:2:1: error: stray ‘\227’ in program

342 210 227 entpuppt sich als UTF-8 für Sternchen-Operator (Unicode-Codepunkt U+2217).

Das Löschen des ‘*’ und erneutes Eingeben behob das Problem.

Benutzeravatar von visu
sehen

Immer wenn der Compiler ein Sonderzeichen gefunden hat, gibt er diese Art von Kompilierungsfehlern aus. Der Fehler, den ich gefunden habe, ist folgender:

Fehler: Streuner ‘\302’ im Programm und Fehler: Streuner ‘\240’ im Programm

….

Es ist ein Stück Code, das ich von einem Chat-Messenger kopiert habe. Im Facebook Messenger, es war nur ein Sonderzeichen. Nach dem Kopieren in den Vim-Editor änderte es sich nur in das richtige Zeichen. Aber der Compiler gab den obigen Fehler aus … dann … diese Aussage, die ich manuell geschrieben habe, nachdem … sie behoben wurde … 🙂

Benutzeravatar von Peter Mortensen
Peter Mortensen

Es liegt vielleicht daran, dass Sie Code aus dem Internet kopiert haben (von einer Site, die vielleicht keine ASCII-codierte Seite, sondern eine UTF-8-codierte Seite hat), sodass Sie den Code von dieser Site in ASCII konvertieren können:

“http://www.percederberg.net/tools/text_converter.html”

Dort können Sie Fehler entweder manuell erkennen, indem Sie sie zurück in UTF-8 konvertieren, oder Sie können sie automatisch in ASCII konvertieren und alle Streuzeichen entfernen.

Benutzeravatar von Peter Mortensen
Peter Mortensen

Dieses Problem tritt auf, wenn Sie Text von einer HTML-Seite kopiert oder Änderungen in einer Windows-Umgebung vorgenommen haben und versuchen, in einer Unix/Solaris-Umgebung zu kompilieren.

Bitte machen Sie “dos2unix” um die Sonderzeichen aus der Datei zu entfernen:

dos2unix fileName.ext fileName.ext

1391260cookie-checkKompilierungsfehler: verirrtes ‘\302’ im Programm usw

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy