]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools/Ecc: Add a checkpoint for invalid PCD info.
authorHess Chen <hesheng.chen@intel.com>
Thu, 25 Jun 2015 07:59:16 +0000 (07:59 +0000)
committerhchen30 <hchen30@Edk2>
Thu, 25 Jun 2015 07:59:16 +0000 (07:59 +0000)
Add a checkpoint to check invalid format of @ValidRange, @ValidList and @Expression for a PCD

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hess Chen <hesheng.chen@intel.com>
Reviewed-by: YangX Li <yangx.li@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17707 6f19259b-4bc3-4df7-8a09-765794883524

BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py

index dbe7f2a2960555949729cea5be4b4a0fcebe6ab9..fc75db38e0312a506be2de624466885a6d122795 100644 (file)
@@ -22,6 +22,7 @@ import copy
 import Common.EdkLogger as EdkLogger\r
 import Common.GlobalData as GlobalData\r
 import EccGlobalData\r
+import EccToolError\r
 \r
 from CommonDataClass.DataClass import *\r
 from Common.DataType import *\r
@@ -1782,6 +1783,89 @@ class DecParser(MetaFileParser):
         if not IsValid:\r
             EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine,\r
                             File=self.MetaFile, Line=self._LineIndex+1)\r
+        \r
+        if EccGlobalData.gConfig.UniCheckPCDInfo == '1' or EccGlobalData.gConfig.UniCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
+            # check Description, Prompt information\r
+            PatternDesc = re.compile('##\s*([\x21-\x7E\s]*)', re.S)\r
+            PatternPrompt = re.compile('#\s+@Prompt\s+([\x21-\x7E\s]*)', re.S)\r
+            Description = None\r
+            Prompt = None\r
+            # check @ValidRange, @ValidList and @Expression format valid\r
+            ErrorCodeValid = '0x0 <= %s <= 0xFFFFFFFF'\r
+            PatternValidRangeIn = '(NOT)?\s*(\d+\s*-\s*\d+|0[xX][a-fA-F0-9]+\s*-\s*0[xX][a-fA-F0-9]+|LT\s*\d+|LT\s*0[xX][a-fA-F0-9]+|GT\s*\d+|GT\s*0[xX][a-fA-F0-9]+|LE\s*\d+|LE\s*0[xX][a-fA-F0-9]+|GE\s*\d+|GE\s*0[xX][a-fA-F0-9]+|XOR\s*\d+|XOR\s*0[xX][a-fA-F0-9]+|EQ\s*\d+|EQ\s*0[xX][a-fA-F0-9]+)'\r
+            PatternValidRng = re.compile('^' + '(NOT)?\s*' + PatternValidRangeIn + '$')\r
+            for Comment in self._Comments:\r
+                Comm = Comment[0].strip()\r
+                if not Comm:\r
+                    continue\r
+                if not Description:\r
+                    Description = PatternDesc.findall(Comm)\r
+                if not Prompt:\r
+                    Prompt = PatternPrompt.findall(Comm)\r
+                if Comm[0] == '#':\r
+                    ValidFormt = Comm.lstrip('#')\r
+                    ValidFormt = ValidFormt.lstrip()\r
+                    if ValidFormt[0:11] == '@ValidRange':\r
+                        ValidFormt = ValidFormt[11:]\r
+                        ValidFormt = ValidFormt.lstrip()\r
+                        try:\r
+                            ErrorCode, Expression = ValidFormt.split('|', 1)\r
+                        except ValueError:\r
+                            ErrorCode = '0x0'\r
+                            Expression = ValidFormt\r
+                        ErrorCode, Expression = ErrorCode.strip(), Expression.strip()\r
+                        try:\r
+                            if not eval(ErrorCodeValid % ErrorCode):\r
+                                EdkLogger.warn('Parser', '@ValidRange ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        except:\r
+                            EdkLogger.warn('Parser', '@ValidRange ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        if not PatternValidRng.search(Expression):\r
+                            EdkLogger.warn('Parser', '@ValidRange Expression(%s) of PCD %s is incorrect format.' % (Expression, TokenList[0]))\r
+                    if ValidFormt[0:10] == '@ValidList':\r
+                        ValidFormt = ValidFormt[10:]\r
+                        ValidFormt = ValidFormt.lstrip()\r
+                        try:\r
+                            ErrorCode, Expression = ValidFormt.split('|', 1)\r
+                        except ValueError:\r
+                            ErrorCode = '0x0'\r
+                            Expression = ValidFormt\r
+                        ErrorCode, Expression = ErrorCode.strip(), Expression.strip()\r
+                        try:\r
+                            if not eval(ErrorCodeValid % ErrorCode):\r
+                                EdkLogger.warn('Parser', '@ValidList ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        except:\r
+                            EdkLogger.warn('Parser', '@ValidList ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        Values = Expression.split(',')\r
+                        for Value in Values:\r
+                            Value = Value.strip()\r
+                            try:\r
+                                eval(Value)\r
+                            except:\r
+                                EdkLogger.warn('Parser', '@ValidList Expression of PCD %s include a invalid value(%s).' % (TokenList[0], Value))\r
+                                break\r
+                    if ValidFormt[0:11] == '@Expression':\r
+                        ValidFormt = ValidFormt[11:]\r
+                        ValidFormt = ValidFormt.lstrip()\r
+                        try:\r
+                            ErrorCode, Expression = ValidFormt.split('|', 1)\r
+                        except ValueError:\r
+                            ErrorCode = '0x0'\r
+                            Expression = ValidFormt\r
+                        ErrorCode, Expression = ErrorCode.strip(), Expression.strip()\r
+                        try:\r
+                            if not eval(ErrorCodeValid % ErrorCode):\r
+                                EdkLogger.warn('Parser', '@Expression ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        except:\r
+                            EdkLogger.warn('Parser', '@Expression ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0]))\r
+                        if not Expression:\r
+                            EdkLogger.warn('Parser', '@Expression Expression of PCD %s is incorrect format.' % TokenList[0])\r
+            if not Description:\r
+                EdkLogger.warn('Parser', 'PCD %s Description information is not provided.' % TokenList[0])\r
+            if not Prompt:\r
+                EdkLogger.warn('Parser', 'PCD %s Prompt information is not provided.' % TokenList[0])\r
+            # check Description, Prompt localization information\r
+            if self._UniObj:\r
+                self._UniObj.CheckPcdInfo(TokenList[0])\r
 \r
         if ValueList[0] in ['True', 'true', 'TRUE']:\r
             ValueList[0] = '1'\r