编译错误:在程序等中迷路'\ 302'

时间:2013-10-05 13:15:21

标签: c compiler-construction

我在编译后面的漏洞利用代码时遇到问题:

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 linux和Ubuntu 10.04上编译它们并获得相同的结果。

13 个答案:

答案 0 :(得分:22)

该行上的字符无效。这就是我所看到的:

enter image description here

答案 1 :(得分:15)

您的来源中包含无效字符。如果您的源中没有任何有效的非ascii字符,可能是双引号字符串文字,您只需将文件转换回ascii:

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

编辑:带有iconv的方法将停在错误的字符中,这没有任何意义。上面的命令行正在使用示例文件。祝你好运: - )

答案 2 :(得分:2)

我和一个明显出现星号的角色一样,但却是一个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。

删除&#39; *&#39;并再次键入它修复了问题。

答案 3 :(得分:1)

每当编译器发现特殊字符时......它会给出这些编译错误的王....我发现的错误如下:

错误:在程序和错误中迷路'\ 302':在程序中错误'\ 240'

...

我从聊天消息中复制了一些代码。在messanger它只是特殊的字符..复制到vim编辑器后它只改为纠正字符。但是编译器给出了上面的错误..然后..那个stamenet我写了mannualy之后...它得到了解决.. :)

答案 4 :(得分:1)

这可能是因为您从网络中复制了代码(来自可能没有ASCII编码页面但是UTF-8编码页面的网站),因此您可以将代码从此站点转换为ASCII:

&#34; http://www.percederberg.net/tools/text_converter.html&#34;

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

答案 5 :(得分:0)

Codo在10月5日完全正确,&amp; current [i]是预期的文本(当源被放入HTML时无意中引入了货币符号(见原文):   http://downloads.securityfocus.com/vulnerabilities/exploits/59846-1.c

Codo的改变使得这个漏洞利用代码编译没有错误。我这样做了,并且能够使用Ubuntu 12.04上的漏洞利用升级到root权限。

答案 6 :(得分:0)

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

尝试找到这些无效字符,或者只是重新输入代码。它肯定会编译。

来源:stray error reason

答案 7 :(得分:0)

当我将文本格式的代码复制并粘贴到我的编辑器(gedit)时,我发现了这个错误。 代码在文本文档(.odt)中,我将其复制并粘贴到gedit中。 如果你这样做,你手动重写代码。

答案 8 :(得分:0)

我注意到使用上面的tr命令时出现问题。 tr命令 COMPLETELY 删除“智能引号”。用这样的东西替换“智能引号”会更好。

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

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

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

sed s/[”“]/'"'/g File.txt > 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/

答案 9 :(得分:0)

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

请做&#34; dos2unix &#34;从文件中删除特殊字符:

dos2unix fileName.ext fileName.ext

答案 10 :(得分:0)

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

  1. 您将不知道自己所解决的问题。
  2. 它还将销毁所有unicode注释。例如://:A²+B²=C²
  3. 这可能会破坏明显的逻辑,但代码仍会被破坏, 但解决方案不太明显。 例如:一个带有“ Smart-Quotes”(“&”)的字符串或一个带有全角astrix的指针(*)。现在,“ SOME_THING”看起来像是#define(SOME_THING),并且* SomeType是错误的类型(SomeType)。

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

  1. 切换字体以查看字符。 (它可能在您当前的字体中不可见)
  2. 正则表达式搜索不属于非扩展ascii的所有unicode字符。 在notepad ++中,我最多可以搜索FFFF,这还没有使我失望。

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

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

    点击“查找下一个”并突出显示看似空白的位置后, 您可以关闭搜索对话框,然后按CTRL + C复制到剪贴板。

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

示例: 我的代码中有一个要点(•)。 unicode值为2022(十六进制),但是当编译器将ascii读取时 您将获得\ 342 \ 200 \ 242(3个八进制值)。它不像将每个八进制值转换为十六进制并将它们粉碎在一起一样简单。因此,“ E2 80 A2”不是您代码中的十六进制unicode点。

答案 11 :(得分:0)

代码中的字符无效。常见的复制粘贴错误,尤其是从Word文档或PDF文件复制代码时。

答案 12 :(得分:-1)

将file.c的名称更改为其他file423.c。可能是因为c文件之间存在名称冲突。