奇妙なgccエラー:プログラム内の「\ NNN」が外れています
-
06-07-2019 - |
質問
オープンソースライブラリに次の問題が発生しました。何が起こっているのかわかりません。
2人のユーザーには、次のような(gcc)コンパイラエラーがあります。
/home/someone/Source/src/._regex.cpp:1:1: warning: null character(s) ignored
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\5’ in program
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\26’ in program
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\7’ in program
/home/someone/Source/src/._regex.cpp:1:5: warning: null character(s) ignored
/home/someone/Source/src/._regex.cpp:1: error: stray ‘\2’ in program
...
これらのエラーを再現できません。テストしたすべてのマシンでコードが正常にコンパイルされます。
グーグルを回ってみると、これはしばしば奇妙なエンコードまたは奇妙なフォーマットの結果であることを示しているように見えますが、すべてのソースを16進エディタで実行し、すべての文字は印刷可能なASCII(0x20-0x7E)、またはタブです改行。それだけです。
また、両方のユーザーが以前のバージョンのライブラリを正常にコンパイルしました。しかし、問題の特定のファイル( regex.cpp
)とそのヘッダーファイルは、それ以来変更されていません!
次を含む詳細については、こちらをご覧ください。必要に応じて、コードをダウンロードするためのリンク。しかし、私は可能な方向へのポインタだけで満足しています。
解決
Baffe Boyoisは一般的な正しい答えを持っています-CMakeのルールはやり過ぎです。
MacOS X 10.5.8(Leopard)では、次のようになります:
Osiris JL: cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/jleffler/tmp/yaml-cpp-0.2.3/build
Osiris JL: make
Scanning dependencies of target yaml-cpp
[ 2%] Building CXX object CMakeFiles/yaml-cpp.dir/src/._conversion.cpp.o
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:1: warning: null character(s) ignored
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\5’ in program
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\22’ in program
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\7’ in program
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:5: warning: null character(s) ignored
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1: error: stray ‘\2’ in program
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:7: warning: null character(s) ignored
/tmp/yaml-cpp-0.2.3/src/._conversion.cpp:1:17: warning: null character(s) ignored
...
コンパイルする必要があるファイルをリストする必要があります。すべてをコンパイルして雑多にしないでください。
問題はCMakeLists.txtにあるようです:
file(GLOB public_headers include/*.h)
file(GLOB private_headers src/*.h)
file(GLOB sources src/*.cpp)
CMake GLOBが少し熱心すぎる(バージョン2.6-patch 4を使用している)か、顧客がMacOS Xを使用している間は使用できません。
「。」で始まるファイルを含むようにGLOBが展開していること誰かの推測です。私はそれをcmakeのバグと見なしたいと思います。
ただし、回避策として、CMakeLists.txtを編集し、これを機能させました:
file(GLOB public_headers include/[a-z]*.h)
file(GLOB private_headers src/[a-z]*.h)
file(GLOB sources src/[a-z]*.cpp)
これは完全な解決策ではありません。yaml-readerディレクトリ内のコードに関する問題が続きました。基本的に同じ方法でyaml-reader / CMakeLists.txtファイルを変更しました。
FWIW:
$ file ._*
._conversion.cpp: AppleDouble encoded Macintosh file
._exp.cpp: AppleDouble encoded Macintosh file
._map.cpp: AppleDouble encoded Macintosh file
._map.h: AppleDouble encoded Macintosh file
._node.cpp: AppleDouble encoded Macintosh file
._null.cpp: AppleDouble encoded Macintosh file
._ostream.cpp: AppleDouble encoded Macintosh file
._parser.cpp: AppleDouble encoded Macintosh file
._regex.cpp: AppleDouble encoded Macintosh file
._regeximpl.h: AppleDouble encoded Macintosh file
._scanner.cpp: AppleDouble encoded Macintosh file
._scanner.h: AppleDouble encoded Macintosh file
._scanscalar.cpp: AppleDouble encoded Macintosh file
._scanscalar.h: AppleDouble encoded Macintosh file
._sequence.cpp: AppleDouble encoded Macintosh file
._simplekey.cpp: AppleDouble encoded Macintosh file
._stream.cpp: AppleDouble encoded Macintosh file
._token.h: AppleDouble encoded Macintosh file
$ odx ._con*.cpp
0x0000: 00 05 16 07 00 02 00 00 4D 61 63 20 4F 53 20 58 ........Mac OS X
0x0010: 20 20 20 20 20 20 20 20 00 02 00 00 00 09 00 00 ........
0x0020: 00 32 00 00 00 79 00 00 00 02 00 00 00 AB 00 00 .2...y..........
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
0x0050: 00 00 00 00 41 54 54 52 00 3C E0 2B 00 00 00 AB ....ATTR.<.+....
0x0060: 00 00 00 9C 00 00 00 0F 00 00 00 00 00 00 00 00 ................
0x0070: 00 00 00 00 00 00 00 01 00 00 00 9C 00 00 00 0F ................
0x0080: 00 00 17 63 6F 6D 2E 61 70 70 6C 65 2E 54 65 78 ...com.apple.Tex
0x0090: 74 45 6E 63 6F 64 69 6E 67 00 00 00 55 54 46 2D tEncoding...UTF-
0x00A0: 38 3B 31 33 34 32 31 37 39 38 34 8;134217984
0x00AB:
$
奇妙な詳細-「src」ディレクトリ内の一部のファイルにはシャドウファイルがありません。 「tar -tvf yaml-cpp-0.2.3.tar.gz」を実行すると、ソースとともに出荷されるファイルが表示されます。
Osiris JL: tar -tvf yaml-cpp-0.2.3.tar.gz
drwxr-xr-x beder/staff 0 2009-10-22 15:13:52 ./
-rw-r--r-- beder/staff 1750 2009-10-22 15:09:05 ./CMakeLists.txt
drwxr-xr-x beder/staff 0 2009-10-19 16:40:15 ./include/
-rw-r--r-- beder/staff 171 2009-09-06 13:41:54 ./include/._conversion.h
-rw-r--r-- beder/staff 1118 2009-09-06 13:41:54 ./include/conversion.h
-rw-r--r-- beder/staff 302 2009-07-29 15:25:23 ./include/crt.h
-rw-r--r-- beder/staff 2254 2009-10-19 16:40:14 ./include/emitter.h
-rw-r--r-- beder/staff 1660 2009-10-19 16:40:14 ./include/emittermanip.h
-rw-r--r-- beder/staff 171 2009-08-18 22:07:22 ./include/._exceptions.h
-rw-r--r-- beder/staff 5638 2009-08-18 22:07:22 ./include/exceptions.h
-rw-r--r-- beder/staff 765 2009-07-29 15:25:23 ./include/iterator.h
-rw-r--r-- beder/staff 444 2009-07-29 15:25:23 ./include/mark.h
-rw-r--r-- beder/staff 171 2009-09-06 12:25:12 ./include/._node.h
-rw-r--r-- beder/staff 3467 2009-09-06 12:25:12 ./include/node.h
-rw-r--r-- beder/staff 171 2009-09-15 20:54:20 ./include/._nodeimpl.h
...
-rw-r--r-- beder/staff 171 2009-07-29 21:28:26 ./include/._yaml.h
-rw-r--r-- beder/staff 321 2009-07-29 21:28:26 ./include/yaml.h
-rw-r--r-- beder/staff 167 2009-09-05 16:01:06 ./._install.txt
-rw-r--r-- beder/staff 652 2009-09-05 16:01:06 ./install.txt
-rw-r--r-- beder/staff 1073 2009-05-29 19:31:21 ./license.txt
drwxr-xr-x beder/staff 0 2009-10-22 14:49:11 ./src/
-rw-r--r-- beder/staff 1697 2009-08-24 16:28:46 ./src/aliascontent.cpp
-rw-r--r-- beder/staff 1171 2009-08-24 16:28:46 ./src/aliascontent.h
-rw-r--r-- beder/staff 112 2009-05-29 19:31:21 ./src/content.cpp
-rw-r--r-- beder/staff 1557 2009-08-24 16:28:46 ./src/content.h
-rw-r--r-- beder/staff 171 2009-09-06 13:31:56 ./src/._conversion.cpp
-rw-r--r-- beder/staff 2027 2009-09-06 13:31:56 ./src/conversion.cpp
...
したがって、悪意のあるファイルは製品のtarファイルに同梱されています。どこかに感染しました-方法はわかりません。
他のヒント
エラーは regex.cpp
ではなく、 ._ regex.cpp
にあります。 ._
で始まるファイルは、MacOSによって自動生成されます。ビルドシステムは、.cppで終わるすべてのファイルをコンパイルしようとしているようです。おそらくドットで始まるものはコンパイルすべきではありません。
一部が破損したファイルである可能性があります。
THEIRシステムの_regex.cppの1行目にあるもの。
ダウンロード/エンコードの問題が発生した場合、コードリポジトリの内容ではなく、システムのファイルの内容を確認する必要があります。
ビルドディレクトリに.oファイルのみがあることを確認してください。この問題が発生し、原因は、1つのソースファイルを.oファイルではなく.cファイルにビルドしたMakefileのエラー(実際はsconsファイル)でした。結果のファイルはバイナリでしたが、gccが.cファイルとして解釈しようとしたと仮定しています。
これは、作成中のc ++プログラムで発生しました。これは、PDFファイルからダブルハッシュの式をコピーしたときに発生しました。
return (randomNumber % (tableSize - 2)) + 1;
それを介して私はモジュロ演算子でしたが、エンコーディングまたは何かであることが判明しましたが、それを削除して手動で入力することでこれを解決しました。