* [PATCH V3] BaseTools: add ASSERT checker for array buffer value assignment.
@ 2018-09-25 6:01 Zhaozh1x
2018-10-15 7:19 ` Gao, Liming
0 siblings, 1 reply; 2+ messages in thread
From: Zhaozh1x @ 2018-09-25 6:01 UTC (permalink / raw)
To: edk2-devel; +Cc: Zhaozh1x, Liming Gao, Yonghong Zhu, Bob Feng
V3:
Update the error message for array checker.
V2:
1. Add comments for each ASSERT.
2. ASSERT need to skip the case of array size of array as zero. For
example, TestArray[] in struct in header file.
V1:
For structure PCD,
1. use compiler time assert to check the array index, report error
if array index exceeds the array number.
2. use compiler time assert to check the array size, report error
if the user declared size in header file is smaller than the user
defined in DEC/DSC file.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: ZhiqiangX Zhao <zhiqiangx.zhao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
---
BaseTools/Source/C/Common/PcdValueCommon.h | 7 +++++++
BaseTools/Source/Python/Workspace/DscBuildData.py | 8 ++++++++
2 files changed, 15 insertions(+)
diff --git a/BaseTools/Source/C/Common/PcdValueCommon.h b/BaseTools/Source/C/Common/PcdValueCommon.h
index 3922428ded..255afdfcc3 100644
--- a/BaseTools/Source/C/Common/PcdValueCommon.h
+++ b/BaseTools/Source/C/Common/PcdValueCommon.h
@@ -22,6 +22,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#define __ARRAY_ELEMENT_SIZE(TYPE, Field) (sizeof((TYPE *)0)->Field[0])
#define __OFFSET_OF(TYPE, Field) ((UINT32) &(((TYPE *)0)->Field))
#define __FLEXIBLE_SIZE(Size, TYPE, Field, MaxIndex) if (__FIELD_SIZE(TYPE, Field) == 0) Size = MAX((__OFFSET_OF(TYPE, Field) + __ARRAY_ELEMENT_SIZE(TYPE, Field) * (MaxIndex)), Size)
+#define __ARRAY_SIZE(Array) (sizeof(Array)/sizeof(Array[0]))
+
+#if defined(_MSC_EXTENSIONS)
+#define __STATIC_ASSERT static_assert
+#else
+#define __STATIC_ASSERT _Static_assert
+#endif
VOID
PcdEntryPoint (
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py
index ac0f0bee47..224c8eda62 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -1826,8 +1826,12 @@ class DscBuildData(PlatformBuildClassObject):
#
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
else:
+ if '[' in FieldName and ']' in FieldName:
+ Index = int(FieldName.split('[')[1].split(']')[0])
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)
if ValueSize > 4:
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
else:
@@ -1905,8 +1909,12 @@ class DscBuildData(PlatformBuildClassObject):
#
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
else:
+ if '[' in FieldName and ']' in FieldName:
+ Index = int(FieldName.split('[')[1].split(']')[0])
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)
if ValueSize > 4:
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
else:
--
2.14.1.windows.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH V3] BaseTools: add ASSERT checker for array buffer value assignment.
2018-09-25 6:01 [PATCH V3] BaseTools: add ASSERT checker for array buffer value assignment Zhaozh1x
@ 2018-10-15 7:19 ` Gao, Liming
0 siblings, 0 replies; 2+ messages in thread
From: Gao, Liming @ 2018-10-15 7:19 UTC (permalink / raw)
To: Zhao, ZhiqiangX, edk2-devel@lists.01.org
Reviewed-by: Liming Gao <liming.gao@intel.com>
>-----Original Message-----
>From: Zhao, ZhiqiangX
>Sent: Tuesday, September 25, 2018 2:01 PM
>To: edk2-devel@lists.01.org
>Cc: Zhao, ZhiqiangX <zhiqiangx.zhao@intel.com>; Gao, Liming
><liming.gao@intel.com>; Zhu, Yonghong <yonghong.zhu@intel.com>; Feng,
>Bob C <bob.c.feng@intel.com>
>Subject: [PATCH V3] BaseTools: add ASSERT checker for array buffer value
>assignment.
>
>V3:
>Update the error message for array checker.
>V2:
>1. Add comments for each ASSERT.
>2. ASSERT need to skip the case of array size of array as zero. For
>example, TestArray[] in struct in header file.
>V1:
>For structure PCD,
>1. use compiler time assert to check the array index, report error
>if array index exceeds the array number.
>2. use compiler time assert to check the array size, report error
>if the user declared size in header file is smaller than the user
>defined in DEC/DSC file.
>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: ZhiqiangX Zhao <zhiqiangx.zhao@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>---
> BaseTools/Source/C/Common/PcdValueCommon.h | 7 +++++++
> BaseTools/Source/Python/Workspace/DscBuildData.py | 8 ++++++++
> 2 files changed, 15 insertions(+)
>
>diff --git a/BaseTools/Source/C/Common/PcdValueCommon.h
>b/BaseTools/Source/C/Common/PcdValueCommon.h
>index 3922428ded..255afdfcc3 100644
>--- a/BaseTools/Source/C/Common/PcdValueCommon.h
>+++ b/BaseTools/Source/C/Common/PcdValueCommon.h
>@@ -22,6 +22,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
>KIND, EITHER EXPRESS OR IMPLIED.
> #define __ARRAY_ELEMENT_SIZE(TYPE, Field) (sizeof((TYPE *)0)->Field[0])
> #define __OFFSET_OF(TYPE, Field) ((UINT32) &(((TYPE *)0)->Field))
> #define __FLEXIBLE_SIZE(Size, TYPE, Field, MaxIndex) if (__FIELD_SIZE(TYPE,
>Field) == 0) Size = MAX((__OFFSET_OF(TYPE, Field) +
>__ARRAY_ELEMENT_SIZE(TYPE, Field) * (MaxIndex)), Size)
>+#define __ARRAY_SIZE(Array) (sizeof(Array)/sizeof(Array[0]))
>+
>+#if defined(_MSC_EXTENSIONS)
>+#define __STATIC_ASSERT static_assert
>+#else
>+#define __STATIC_ASSERT _Static_assert
>+#endif
>
> VOID
> PcdEntryPoint (
>diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
>b/BaseTools/Source/Python/Workspace/DscBuildData.py
>index ac0f0bee47..224c8eda62 100644
>--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
>@@ -1826,8 +1826,12 @@ class DscBuildData(PlatformBuildClassObject):
> #
> CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' %
>(Pcd.DatumType, FieldName)
> CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' %
>(DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1],
>FieldList[FieldName][2], FieldList[FieldName][0])
>+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d)
>|| (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); //
>From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize,
>Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2],
>FieldList[FieldName][0])
> CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 &&
>FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
> else:
>+ if '[' in FieldName and ']' in FieldName:
>+ Index = int(FieldName.split('[')[1].split(']')[0])
>+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd-
>>%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array
>number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0],
>FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2],
>FieldName)
> if ValueSize > 4:
> CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d
>Value %s\n' % (FieldName, Value, FieldList[FieldName][1],
>FieldList[FieldName][2], FieldList[FieldName][0])
> else:
>@@ -1905,8 +1909,12 @@ class DscBuildData(PlatformBuildClassObject):
> #
> CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' %
>(Pcd.DatumType, FieldName)
> CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' %
>(DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1],
>FieldList[FieldName][2], FieldList[FieldName][0])
>+ CApp = CApp + '
>__STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s)
>== 0), "Input buffer exceeds the buffer array"); // From %s Line %d
>Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType,
>FieldName, FieldList[FieldName][1], FieldList[FieldName][2],
>FieldList[FieldName][0])
> CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 &&
>FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
> else:
>+ if '[' in FieldName and ']' in FieldName:
>+ Index = int(FieldName.split('[')[1].split(']')[0])
>+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd-
>>%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array
>number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0],
>FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2],
>FieldName)
> if ValueSize > 4:
> CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d
>Value %s\n' % (FieldName, Value, FieldList[FieldName][1],
>FieldList[FieldName][2], FieldList[FieldName][0])
> else:
>--
>2.14.1.windows.1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-10-15 7:19 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-25 6:01 [PATCH V3] BaseTools: add ASSERT checker for array buffer value assignment Zhaozh1x
2018-10-15 7:19 ` Gao, Liming
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox