From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: zhijux.fan@intel.com) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by groups.io with SMTP; Sun, 05 May 2019 19:35:10 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 May 2019 19:35:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,435,1549958400"; d="dat'59?scan'59,208,59";a="168141005" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga002.fm.intel.com with ESMTP; 05 May 2019 19:35:10 -0700 Received: from fmsmsx152.amr.corp.intel.com (10.18.125.5) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 5 May 2019 19:35:09 -0700 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX152.amr.corp.intel.com (10.18.125.5) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 5 May 2019 19:35:09 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.18]) with mapi id 14.03.0415.000; Mon, 6 May 2019 10:35:07 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH] BaseTools:ECC report errors on account of analyze special characters Thread-Topic: [PATCH] BaseTools:ECC report errors on account of analyze special characters Thread-Index: AdUDtAp7PFu2tHUrTs6tJWIguAzO+g== Date: Mon, 6 May 2019 02:35:07 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 40017 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB52SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB52SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1751 In case that a C function body contains the string of L'', L'\"',=20 L"\"", L''', L""", L"\"\"", L"\"^", L" \"", L"\" \"", ('L",\\\""')=20 ECC tool running under python3 interpreter will report error.=20 The antlr4 module misidentified this character This patch is going to fix that issue. Cc: Bob Feng Cc: Liming Gao Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/Ecc/CodeFragmentCollector.py | 5 ++++- BaseTools/Source/Python/Ecc/Configuration.py | 5 +++++ BaseTools/Source/Python/Ecc/c.py | 3 +++ BaseTools/Source/Python/Ecc/config.ini | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py b/BaseToo= ls/Source/Python/Ecc/CodeFragmentCollector.py index f844b4a0b3..589e8d91e6 100644 --- a/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py +++ b/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py @@ -79,7 +79,7 @@ class CodeFragmentCollector: self.FileName =3D FileName self.CurrentLineNumber =3D 1 self.CurrentOffsetWithinLine =3D 0 - + self.TokenReleaceList =3D [] self.__Token =3D "" self.__SkippedChars =3D "" =20 @@ -509,6 +509,9 @@ class CodeFragmentCollector: FileStringContents =3D '' for fileLine in self.Profile.FileLinesList: FileStringContents +=3D fileLine + for Token in self.TokenReleaceList: + if Token in FileStringContents: + FileStringContents =3D FileStringContents.replace(Token, '= TOKENSTRING') cStream =3D antlr.InputStream(FileStringContents) lexer =3D CLexer(cStream) tStream =3D antlr.CommonTokenStream(lexer) diff --git a/BaseTools/Source/Python/Ecc/Configuration.py b/BaseTools/Sourc= e/Python/Ecc/Configuration.py index 66c8dd7880..9ebd130c31 100644 --- a/BaseTools/Source/Python/Ecc/Configuration.py +++ b/BaseTools/Source/Python/Ecc/Configuration.py @@ -120,6 +120,7 @@ _ConfigFileToInternalTranslation =3D { "SmmCommParaCheckBufferType":"SmmCommParaCheckBufferType", "SpaceCheckAll":"SpaceCheckAll", "SpellingCheckAll":"SpellingCheckAll", + "TokenReleaceList":"TokenReleaceList", "UniCheckAll":"UniCheckAll", "UniCheckHelpInfo":"UniCheckHelpInfo", "UniCheckPCDInfo":"UniCheckPCDInfo", @@ -395,6 +396,8 @@ class Configuration(object): # A list for Copyright format self.Copyright =3D [] =20 + self.TokenReleaceList =3D [] + self.ParseConfig() =20 def ParseConfig(self): @@ -425,6 +428,8 @@ class Configuration(object): List[1] =3D GetSplitValueList(List[1], TAB_COMMA_SPLIT= ) if List[0] =3D=3D 'Copyright': List[1] =3D GetSplitValueList(List[1], TAB_COMMA_SPLIT= ) + if List[0] =3D=3D 'TokenReleaceList': + List[1] =3D GetSplitValueList(List[1], TAB_COMMA_SPLIT= ) self.__dict__[_ConfigFileToInternalTranslation[List[0]]] = =3D List[1] =20 def ShowMe(self): diff --git a/BaseTools/Source/Python/Ecc/c.py b/BaseTools/Source/Python/Ecc= /c.py index 7b645ff053..75fe4544a1 100644 --- a/BaseTools/Source/Python/Ecc/c.py +++ b/BaseTools/Source/Python/Ecc/c.py @@ -501,6 +501,8 @@ def CollectSourceCodeDataIntoDB(RootDir): tuple =3D os.walk(RootDir) IgnoredPattern =3D GetIgnoredDirListPattern() ParseErrorFileList =3D [] + TokenReleaceList =3D EccGlobalData.gConfig.TokenReleaceList + TokenReleaceList.extend(['L",\\\""']) =20 for dirpath, dirnames, filenames in tuple: if IgnoredPattern.match(dirpath.upper()): @@ -525,6 +527,7 @@ def CollectSourceCodeDataIntoDB(RootDir): EdkLogger.info("Parsing " + FullName) model =3D f.endswith('c') and DataClass.MODEL_FILE_C or Da= taClass.MODEL_FILE_H collector =3D CodeFragmentCollector.CodeFragmentCollector(= FullName) + collector.TokenReleaceList =3D TokenReleaceList try: collector.ParseFile() except UnicodeError: diff --git a/BaseTools/Source/Python/Ecc/config.ini b/BaseTools/Source/Pyth= on/Ecc/config.ini index 00c98c6232..cdd294280e 100644 --- a/BaseTools/Source/Python/Ecc/config.ini +++ b/BaseTools/Source/Python/Ecc/config.ini @@ -283,3 +283,5 @@ SmmCommParaCheckBufferType =3D 1 BinaryExtList =3D EXE, EFI, FV, ROM, DLL, COM, BMP, GIF, PYD, CMP, BIN, JP= G, UNI, RAW, COM2, LIB, DEPEX, SYS, DB # A list for only scanning dirs, the dirs should be the top folder(s) unde= r workspace ScanOnlyDirList =3D ScanFolder1 ScanFolder2 +# A list for Used to circumvent special strings +TokenReleaceList =3D L'', L'\"', L"\"", L''', L""", L"\"\"", L"\"^", L" \"= ", L"\" \"" --=20 2.14.1.windows.1 GitPatchExtractor 1.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB52SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IvQlAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAAEMyMzc5MEFB OTY4MzA2NDE5MDc4QzhERUIzMkMyRkIwAB8HAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBQAGAAIA IwAHAAEAIgEBIIADAA4AAADjBwUABgACACMABwABACIBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAE0AAABbUEFUQ0hdIEJhc2VUb29sczpFQ0MgcmVwb3J0IGVycm9ycyBv biBhY2NvdW50IG9mIGFuYWx5emUgc3BlY2lhbCBjaGFyYWN0ZXJzAKYbAQuAAQAhAAAAQzIzNzkw QUE5NjgzMDY0MTkwNzhDOERFQjMyQzJGQjAAHwcBA5AGAPQTAAA0AAAAAgF/AAEAAABIAAAAPEZB RDBEN0UwQUUwRkE1NEQ5ODdGNkU3MjQzNUNBRkQ1MEFGNUJCNTJAU0hTTVNYMTAxLmNjci5jb3Jw LmludGVsLmNvbT4ACwAfDgEAAAACAQkQAQAAAOwJAADoCQAAuxYAAExaRnWWC62ZYQAKZmJpZAQA AGNjwHBnMTI1MgD+A0PwdGV4dAH3AqQD4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCWfQqA CMg7CWIxOQ7AvwnDFnIKMhZxAoAVYioJsHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZSdgSQ F7YCEHIAwHR9CFBuGjEQIAXABaAbZGSaIANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAKcRfy YmttawZzAZAAICBCTV9C4EVHSU59CvwB8QvxER+wWjpoAkBwczrALy9idWd6AxALYCQudAcwbm8F oWUuAQWwZy9zaG93X0EiUS5jZ2k/DdA9qDE3NQBQbAuAZQqB/SUUSQOgHlASABzAEdAFQIhhIEMc cHVuYyLg5QIgIAbgZHkb0gGQC4C/BCAmYBngH2AFEBnAIBkwICBMJycsKTFcXKYiKWElBUwiKbEi KXK/KVMqwCrSKpIqpSqSXiuTpwMwLCgtJSgnKoAsKbCTLqIqwCcpKgZFQybQ8xiQBvAgcicAAwAo 4ScAMQSBIHB5JmACIDMg+wuAG6FwCXAbogPwIqAwQDRlcAkRIASQA2ByLg0qBlQocQBwdGxyNPog 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 QlzRRVBbwPXgU1m6U1zRQkTG0Vu2cGwCIPxzY7YASwAu0SHRItF2gP+HAGPS1BD+MC9QMvBz0GQj PWdgcNHRZQAnYZwgIHXLqaGNQHeNMGtzvCJExnpTY1FPYwEVlXwhZ/JGt2XzBoBpGDJThtFbVdpw rzLwgqCBEBCgY3OwdjpBv9QQfiBsULXA1BCKk3NThv89z/wRhTBgUYVAH/Bvwnxg/x/xb9Jvs3xQ cMJwgnCVcIL+XnGD/RByGHMTUFf9Fk8Q/DE0dUASQKmR/kCWYFo2/kdIcBRRJoBbITigN+N1gBla Nn19RRB4oB8AQgABAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AZQABAAAAKgAAAHoA aABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwBkAAEAAAAKAAAAUwBN AFQAUAAAAAAAAgFBAAEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoA aABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBj AG8AbQAAAB8AAl0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8A bQAAAAAAHwDlXwEAAAAyAAAAcwBpAHAAOgB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBs AC4AYwBvAG0AAAAAAB8AGgwBAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AHwwBAAAA KgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAeDAEAAAAK AAAAUwBNAFQAUAAAAAAAAgEZDAEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4A LAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABl AGwALgBjAG8AbQAAAB8AAV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwA LgBjAG8AbQAAAAAAHwD4PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAjQAEAAAAq AAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfACJAAQAAAAoA AABTAE0AVABQAAAAAAACAfk/AQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAs ACAAWgBoAGkAagB1AFgAAABTAE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUA bAAuAGMAbwBtAAAAHwAJXQEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAu AGMAbwBtAAAAAAALAEA6AQAAAB8AGgABAAAAEgAAAEkAUABNAC4ATgBvAHQAZQAAAAAAAwDxPwkE AAALAEA6AQAAAAMA/T/kBAAAAgELMAEAAAAQAAAAwjeQqpaDBkGQeMjesywvsAMAFwABAAAAQAA5 AIB/SFG0A9UBQAAIMO+fd1G0A9UBHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAHgAAAGEAYwBjAGUA cAB0AGwAYQBuAGcAdQBhAGcAZQAAAAAAAQAAAAwAAABlAG4ALQBVAFMAAAAfADcAAQAAAJoAAABb AFAAQQBUAEMASABdACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBFAEMAQwAgAHIAZQBwAG8AcgB0ACAA ZQByAHIAbwByAHMAIABvAG4AIABhAGMAYwBvAHUAbgB0ACAAbwBmACAAYQBuAGEAbAB5AHoAZQAg AHMAcABlAGMAaQBhAGwAIABjAGgAYQByAGEAYwB0AGUAcgBzAAAAAAAfAD0AAQAAAAIAAAAAAAAA AwA2AAAAAAACAXEAAQAAABYAAAAB1QO0Cns8W7a0dStOzq0lYiC4DM76AAAfAHAAAQAAAJoAAABb AFAAQQBUAEMASABdACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBFAEMAQwAgAHIAZQBwAG8AcgB0ACAA ZQByAHIAbwByAHMAIABvAG4AIABhAGMAYwBvAHUAbgB0ACAAbwBmACAAYQBuAGEAbAB5AHoAZQAg AHMAcABlAGMAaQBhAGwAIABjAGgAYQByAGEAYwB0AGUAcgBzAAAAAAAfADUQAQAAAJAAAAA8AEYA QQBEADAARAA3AEUAMABBAEUAMABGAEEANQA0AEQAOQA4ADcARgA2AEUANwAyADQAMwA1AEMAQQBG AEQANQAwAEEARgA1AEIAQgA1ADIAQABTAEgAUwBNAFMAWAAxADAAMQAuAGMAYwByAC4AYwBvAHIA cAAuAGkAbgB0AGUAbAAuAGMAbwBtAD4AAAADAN4/n04AAEAABzDJe3BRtAPVAQIBCwABAAAAEAAA AMI3kKqWgwZBkHjI3rMsL7ADACYAAAAAAAIBRwABAAAAMgAAAGM9VVM7YT1NQ0k7cD1JbnRlbDts PVNIU01TWDEwMS0xOTA1MDYwMjM1MDdaLTQ1MTgAAAACARAwAQAAAEYAAAAAAAAAJne9OTvsOEmk phU9y6V7QgcA+tDX4K4PpU2Yf25yQ1yv1QAAAEQRXgAAppNoNoh2bEunStPrR5pMZAAACVSPYAAA AAAfAPo/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAADAAlZAQAAAEAAAIAIIAYAAAAA AMAAAAAAAABGAAAAAL+FAACgxfxPtAPVAQsAAIAIIAYAAAAAAMAAAAAAAABGAAAAAIKFAAAAAAAA AwAAgAggBgAAAAAAwAAAAAAAAEYAAAAA64UAAAkEAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAY AAAAZABsAHAALQBwAHIAbwBkAHUAYwB0AAAAAQAAABoAAABkAGwAcABlAC0AdwBpAG4AZABvAHcA cwAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AdgBlAHIAcwBpAG8AbgAA AAEAAAAWAAAAMQAxAC4AMAAuADYAMAAwAC4ANwAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAA GgAAAGQAbABwAC0AcgBlAGEAYwB0AGkAbwBuAAAAAAABAAAAFAAAAG4AbwAtAGEAYwB0AGkAbwBu AAAAAwANNP0/AAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAgAAAAeAAtAG0AcwAtAGgAYQBzAC0A YQB0AHQAYQBjAGgAAAABAAAAAgAAAAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAiAAAAeAAt AG8AcgBpAGcAaQBuAGEAdABpAG4AZwAtAGkAcAAAAAAAAQAAACAAAABbADEAMAAuADIAMwA5AC4A MQAyADcALgA0ADAAXQAAAImJ --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB52SHSMSX101ccrcor_--