【问题标题】:Compilation error: stray ‘\302’ in program, etc编译错误:程序中出现杂散“\302”等
【发布时间】:2023-03-07 04:19:02
【问题描述】:

我在编译以下漏洞利用代码时遇到问题:

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

我正在使用“gcc file.c”“gcc -O2 file.c”,但是它们都导致以下错误:

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

我尝试在 Kali LinuxUbuntu 10.04 (Lucid Lynx) 上编译它们并得到相同的结果。

【问题讨论】:

  • 在我看来,您的文件包含“国家”字符,这些字符在标识符或类似的标识符中是不合法的。但是您确实应该在问题中包含出现这些错误的行。
  • 错误信息说明一切。
  • \302\244 是 UTF-8 序列 0xC2 0xA4 的八进制表示,即货币符号:¤。
  • 这道题是canonical题,针对从网页、PDF文档或通过聊天复制粘贴代码时经常遇到的杂散字符问题(例如、Skype 聊天或Facebook Messenger)。因此,它应该得到全面的答案。目前,只有 twitchdotcom slash KANJICODER's answer 符合这个要求。
  • 常见的一个是杂散 '\342' '\200' '\213' (八进制数 - UTF-8 字节序列 0xE2 0x80 0x8B,Unicode 码位 U+200B (ZERO WIDTH SPACE)) .在Geany 中以正则表达式模式搜索/替换\x{200B} 有效。

标签: c compiler-construction


【解决方案1】:

您在该行中有一个无效字符。这是我看到的:

【讨论】:

  • 谢谢,但这仅删除了 2 行错误,并且仍然存在这些错误 raw.c: In function 'sc': raw.c:76: error: 't' undeclared (first use in this function) raw.c:76: error: (每个未声明的标识符只报告一次 raw.c:76: error: 对于它出现的每个函数。)
  • @AhmedTaher:修复肯定会删除您问题中的错误消息。如果还有其他错误,请将它们添加到您的问题中。
  • uint64_t *p = (void *) ¤t[i]; 这行很可能需要更改为uint64_t *p = (void *) &current[i];。 (¤ 是货币符号的 HTML 实体。
  • 如果您从代码中删除货币符号,则无法再生成这些错误消息。这根本不可能。
  • 真正的解释是,过去浏览器在渲染非常糟糕的 HTML 代码的能力上有很多竞争,其中有很多错误。 OP 的浏览器在显示代码示例时,看到一个以 & 开头并以分号结尾的字符序列,与 HTML 实体不完全匹配,但很接近,它决定进行替换,但也显示额外的文本...这是浏览器的 HTML 解析错误,因为它试图提供太多帮助。
【解决方案2】:

您的来源中有无效字符。如果您的源代码中没有任何有效的非 ASCII 字符,可能是双引号字符串文字,您可以简单地将文件转换回 ASCII:

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

带有 iconv 的方法会在错误的字符处停止,这是没有意义的。上面的命令行正在使用示例文件。

【讨论】:

    【解决方案3】:

    当然,将文件转换为 ASCII 并删除所有 Unicode 字符。 它可能会起作用...... 但是......

    1. 你不会知道你修复了什么。
    2. 它还会破坏所有 Unicode cmets。示例: //: A²+B²=C²
    3. 它可能会损坏明显的逻辑并且代码仍然会被破坏, 但解决方案不太明显。 例如:带有“Smart-Quotes”(“ & ”)的字符串或带有全角星号(*)的指针。现在“SOME_THING”看起来像#define (SOME_THING) 并且 *SomeType 是错误的类型 (SomeType)。

    另外两种解决问题的手术方法:

    1. 切换字体以查看字符。 (它可能在您当前的字体中不可见)

    2. 正则表达式搜索所有不属于非扩展 ASCII 的 Unicode 字符。

      Notepad++ 中,我最多可以搜索到 FFFF,这还没有让我失望。

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

      80 是 128 的十六进制,第一个扩展的 ASCII 字符。

      点击“查找下一个”并突出显示空白区域后,您可以关闭搜索对话框并按 Ctrl + C 复制到剪贴板。

      然后将字符粘贴到 Unicode 搜索工具中。 我通常使用在线的。 http://unicode.scarfboy.com/

    例子:

    不知何故,我的代码中有一个要点 (•)。 Unicode 值为 2022(十六进制),但当编译器读取为 ASCII 时 你得到 \342 \200 \242 (3个八进制值)。这不像将每个八进制值转换为十六进制并将它们粉碎在一起那么简单。所以“E2 80 A2”不是代码中的十六进制 Unicode 点。

    【讨论】:

    【解决方案4】:

    我得到了一个明显显示为星号的字符,但它是一个 UTF-8 序列:

    Encoder * st;
    

    编译后返回:

    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 原来是 ASTERISK OPERATOR 的 UTF-8(Unicode 代码点 U+2217)。

    删除“*”并再次输入即可解决问题。

    【讨论】:

    • 更直接的分析是 226 136 151(八进制)→ 0xE2 0x88 0x97(十六进制)→ Unicode 代码点 U+2217 (ASTERISK OPERATOR) 的 UTF-8 序列。
    • 或者,在支持正则表达式和 Unicode(例如,GeanyNotepad++UltraEdit)的文本编辑器中搜索/替换 \x{2217}
    【解决方案5】:

    每当编译器发现一个特殊字符时,它就会给出这些类型的编译错误。我发现的错误如下:

    错误:程序中出现杂散“\302”和错误:程序中出现杂散“\240”

    ....

    这是我从聊天信使那里复制的一段代码。在Facebook Messenger 中,它只是一个特殊字符。复制到 Vim 编辑器后,它只更改为正确的字符。但是编译器给出了上述错误..然后..我在之后手动编写的那条语句..它得到了解决... :)

    【讨论】:

      【解决方案6】:

      这可能是因为您从 Internet 上复制了代码(从一个可能不是 ASCII 编码页面,而是一个 UTF-8 编码页面的站点),所以您可以从该站点将代码转换为 ASCII:

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

      您可以通过将其转换回 UTF-8 来手动检测错误,也可以将其自动转换为 ASCII 并删除所有杂散字符。

      【讨论】:

      • 是的,这是很常见的情况。网页代码中常见的有EN DASHEM DASHMINUS SIGN(与ASCII一号不同——UTF-8序列0xE2 0x88 0x92)。它们可以在支持正则表达式的文本编辑器中分别通过\x{2013}\x{2014}\x{2212} 进行搜索/替换。
      【解决方案7】:

      当您从 HTML 页面复制一些文本或在 Windows 环境中进行了修改并尝试在 Unix/Solaris 环境中编译时,就会出现此问题。

      请执行“dos2unix”从文件中删除特殊字符:

      dos2unix fileName.ext fileName.ext
      

      【讨论】:

        【解决方案8】:

        您的代码中有无效字符

        这是一种常见的复制粘贴错误,尤其是从Microsoft Word 文档或 PDF 文件中复制代码时。

        【讨论】:

          【解决方案9】:

          我注意到使用上述 tr 命令时出现问题。 tr 命令COMPLETELY 删除“智能引号”。最好将 "smart quotes" 替换为类似的内容。

          这将使您快速预览将要替换的内容。

          sed s/[”“]/'"'/g File.txt

          这将执行替换并将替换放入名为WithoutSmartQuotes.txt 的新文件中。

          sed s/[”“]/'"'/g File.txt &gt; WithoutSmartQuotes.txt

          这将覆盖原始文件。

          sed -i ".bk" s/[”“]/'"'/g File.txt

          http://developmentality.wordpress.com/2010/10/11/how-to-remove-smart-quotes-from-a-text-file/

          【讨论】:

          • 但是这些工具不需要知道 Unicode 才能使其工作(至少在一般情况下)?是吗?
          【解决方案10】:

          Codo was exactly right on Oct. 5 &amp;current[i] 是预期的文本(在将源放入 HTML 时无意中引入了货币符号(参见原文):

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

          Codo 的更改使该漏洞利用代码编译时不会出错。我这样做了,并且能够使用Ubuntu 12.04(Precise Pangolin)上的漏洞来升级到 root 权限。

          【讨论】:

            【解决方案11】:

            这里给出的解释是正确的。我只是想补充一点,这个问题可能是因为您从某个地方、网站或 PDF 文件中复制了代码,导致代码中有一些无效字符。

            尝试找出那些无效字符,或者如果找不到,就重新输入代码。到时候肯定会编译的。

            来源:stray error reason

            【讨论】:

              【解决方案12】:

              对于我来说,当我将文本格式的代码复制并粘贴到我的编辑器 (gedit) 时发生了这个错误。

              代码位于文本文档 (.odt) 中。我将它复制并粘贴到 gedit 中。

              如果你做了同样的事情,你已经手动重写了代码。

              【讨论】:

              • 不需要重写代码。例如,在 Notepad++ 中,您可以搜索和替换 Unicode 代码点。例如。 \x{00A0}(通过使用文件的二进制/十六进制视图识别)通过 Skype Chat 复制时遇到的问题。
              猜你喜欢
              • 2011-07-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-20
              • 2016-07-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多