已合并
fix: 为foreach手写aclnn算子补充tensor list空元素检查 #9494
luoyufan7创建于 8月29日
fix: 为foreach手写aclnn算子补充tensor list空元素检查 #9494
已合并
luoyufan7创建于 8月29日
共 20 个文件变更+355-1
@@ -129,6 +129,28 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
129 const aclTensorList* out)129 const aclTensorList* out)
130{130{
131 CHECK_RET(CheckNotNull(x1, x2, alpha, out), ACLNN_ERR_PARAM_NULLPTR);131 CHECK_RET(CheckNotNull(x1, x2, alpha, out), ACLNN_ERR_PARAM_NULLPTR);
132+ 
133+ // Check every entry in tensor lists is not null, to avoid null pointer
134+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
135+ for (uint64_t i = 0; i < x1->Size(); i++) {
136+ if ((*x1)[i] == nullptr) {
137+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x1[%lu] is null.", i);
138+ return ACLNN_ERR_PARAM_INVALID;
139+ }
140+ }
141+ for (uint64_t i = 0; i < x2->Size(); i++) {
142+ if ((*x2)[i] == nullptr) {
143+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
144+ return ACLNN_ERR_PARAM_INVALID;
145+ }
146+ }
147+ for (uint64_t i = 0; i < out->Size(); i++) {
148+ if ((*out)[i] == nullptr) {
149+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
150+ return ACLNN_ERR_PARAM_INVALID;
151+ }
152+ }
153+ 
132 CHECK_RET(CheckDtypeValid(x1, x2, alpha, out), ACLNN_ERR_PARAM_INVALID);154 CHECK_RET(CheckDtypeValid(x1, x2, alpha, out), ACLNN_ERR_PARAM_INVALID);
133 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);155 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
134 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);156 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
@@ -158,6 +158,16 @@ static inline aclnnStatus ForeachAddListV2CheckParams(const aclTensorList* self,
158 CHECK_RET(ForeachAddListV2CheckNotNull(self, x2, scalar, out), ACLNN_ERR_PARAM_NULLPTR);158 CHECK_RET(ForeachAddListV2CheckNotNull(self, x2, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
159 CHECK_RET(self->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);159 CHECK_RET(self->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);
160 CHECK_RET(self->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);160 CHECK_RET(self->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);
161+ 
162+ // Check every entry in tensor lists is not null, to avoid null pointer
163+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
164+ for (uint64_t i = 0; i < self->Size(); i++) {
165+ if ((*self)[i] == nullptr || (*x2)[i] == nullptr || (*out)[i] == nullptr) {
166+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "Tensor entry at index %lu is null.", i);
167+ return ACLNN_ERR_PARAM_INVALID;
168+ }
169+ }
170+ 
161 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验171 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
162 CHECK_RET(ForeachAddListV2CheckDtypeValid(self, x2, scalar, out), ACLNN_ERR_PARAM_INVALID);172 CHECK_RET(ForeachAddListV2CheckDtypeValid(self, x2, scalar, out), ACLNN_ERR_PARAM_INVALID);
163 // 3. 检查shape是否满足约束173 // 3. 检查shape是否满足约束
@@ -132,6 +132,34 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
132 const aclTensor* scalar, const aclTensorList* out)132 const aclTensor* scalar, const aclTensorList* out)
133{133{
134 CHECK_RET(CheckNotNull(x1, x2, x3, scalar, out), ACLNN_ERR_PARAM_NULLPTR);134 CHECK_RET(CheckNotNull(x1, x2, x3, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
135+ 
136+ // Check every entry in tensor lists is not null, to avoid null pointer
137+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
138+ for (uint64_t i = 0; i < x1->Size(); i++) {
139+ if ((*x1)[i] == nullptr) {
140+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x1[%lu] is null.", i);
141+ return ACLNN_ERR_PARAM_INVALID;
142+ }
143+ }
144+ for (uint64_t i = 0; i < x2->Size(); i++) {
145+ if ((*x2)[i] == nullptr) {
146+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
147+ return ACLNN_ERR_PARAM_INVALID;
148+ }
149+ }
150+ for (uint64_t i = 0; i < x3->Size(); i++) {
151+ if ((*x3)[i] == nullptr) {
152+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x3[%lu] is null.", i);
153+ return ACLNN_ERR_PARAM_INVALID;
154+ }
155+ }
156+ for (uint64_t i = 0; i < out->Size(); i++) {
157+ if ((*out)[i] == nullptr) {
158+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
159+ return ACLNN_ERR_PARAM_INVALID;
160+ }
161+ }
162+ 
135 CHECK_RET(CheckDtypeValid(x1, x2, x3, scalar, out), ACLNN_ERR_PARAM_INVALID);163 CHECK_RET(CheckDtypeValid(x1, x2, x3, scalar, out), ACLNN_ERR_PARAM_INVALID);
136 CHECK_RET(CheckShape(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);164 CHECK_RET(CheckShape(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);
137 CHECK_RET(CheckFormat(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);165 CHECK_RET(CheckFormat(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);
@@ -163,6 +163,33 @@ static inline aclnnStatus ForeachAddcdivScalarV2CheckParams(const aclTensorList*
163{163{
164 // 1. 检查参数是否为空指针164 // 1. 检查参数是否为空指针
165 CHECK_RET(ForeachAddcdivScalarV2CheckNotNull(self, x2, x3, scalar, out), ACLNN_ERR_PARAM_NULLPTR);165 CHECK_RET(ForeachAddcdivScalarV2CheckNotNull(self, x2, x3, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
166+ 
167+ // 检查 tensor list 内部每个条目非空,避免后续空指针解引用
168+ for (uint64_t i = 0; i < self->Size(); i++) {
169+ if ((*self)[i] == nullptr) {
170+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
171+ return ACLNN_ERR_PARAM_INVALID;
172+ }
173+ }
174+ for (uint64_t i = 0; i < x2->Size(); i++) {
175+ if ((*x2)[i] == nullptr) {
176+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
177+ return ACLNN_ERR_PARAM_INVALID;
178+ }
179+ }
180+ for (uint64_t i = 0; i < x3->Size(); i++) {
181+ if ((*x3)[i] == nullptr) {
182+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x3[%lu] is null.", i);
183+ return ACLNN_ERR_PARAM_INVALID;
184+ }
185+ }
186+ for (uint64_t i = 0; i < out->Size(); i++) {
187+ if ((*out)[i] == nullptr) {
188+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
189+ return ACLNN_ERR_PARAM_INVALID;
190+ }
191+ }
192+ 
166 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验193 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
167 CHECK_RET(ForeachAddcdivScalarV2CheckDtypeValid(self, x2, x3, scalar, out), ACLNN_ERR_PARAM_INVALID);194 CHECK_RET(ForeachAddcdivScalarV2CheckDtypeValid(self, x2, x3, scalar, out), ACLNN_ERR_PARAM_INVALID);
168 // 3. 检查shape是否满足约束195 // 3. 检查shape是否满足约束
@@ -120,6 +120,16 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
120 CHECK_RET(x1->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);120 CHECK_RET(x1->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);
121 CHECK_RET(x1->Size() == x3->Size(), ACLNN_ERR_PARAM_INVALID);121 CHECK_RET(x1->Size() == x3->Size(), ACLNN_ERR_PARAM_INVALID);
122 CHECK_RET(x1->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);122 CHECK_RET(x1->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);
123+ 
124+ // Check every entry in tensor lists is not null, to avoid null pointer
125+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
126+ for (uint64_t i = 0; i < x1->Size(); i++) {
127+ if ((*x1)[i] == nullptr || (*x2)[i] == nullptr || (*x3)[i] == nullptr || (*out)[i] == nullptr) {
128+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "Tensor entry at index %lu is null.", i);
129+ return ACLNN_ERR_PARAM_INVALID;
130+ }
131+ }
132+ 
123 CHECK_RET(CheckDtypeValid(x1, x2, x3, scalars, out), ACLNN_ERR_PARAM_INVALID);133 CHECK_RET(CheckDtypeValid(x1, x2, x3, scalars, out), ACLNN_ERR_PARAM_INVALID);
124 CHECK_RET(CheckShape(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);134 CHECK_RET(CheckShape(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);
125 CHECK_RET(CheckFormat(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);135 CHECK_RET(CheckFormat(x1, x2, x3, out), ACLNN_ERR_PARAM_INVALID);
@@ -128,6 +128,22 @@ static inline bool CheckShape(const aclTensorList* x, const aclTensorList* out)
128static inline aclnnStatus CheckParams(const aclTensorList* x, const aclTensorList* out)128static inline aclnnStatus CheckParams(const aclTensorList* x, const aclTensorList* out)
129{129{
130 CHECK_RET(CheckNotNull(x, out), ACLNN_ERR_PARAM_NULLPTR);130 CHECK_RET(CheckNotNull(x, out), ACLNN_ERR_PARAM_NULLPTR);
131+ 
132+ // Check every entry in tensor lists is not null, to avoid null pointer
133+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
134+ for (uint64_t i = 0; i < x->Size(); i++) {
135+ if ((*x)[i] == nullptr) {
136+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x[%lu] is null.", i);
137+ return ACLNN_ERR_PARAM_INVALID;
138+ }
139+ }
140+ for (uint64_t i = 0; i < out->Size(); i++) {
141+ if ((*out)[i] == nullptr) {
142+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
143+ return ACLNN_ERR_PARAM_INVALID;
144+ }
145+ }
146+ 
131 CHECK_RET(CheckDtypeValid(x, out), ACLNN_ERR_PARAM_INVALID);147 CHECK_RET(CheckDtypeValid(x, out), ACLNN_ERR_PARAM_INVALID);
132 CHECK_RET(CheckShape(x, out), ACLNN_ERR_PARAM_INVALID);148 CHECK_RET(CheckShape(x, out), ACLNN_ERR_PARAM_INVALID);
133 CHECK_RET(CheckFormat(x, out), ACLNN_ERR_PARAM_INVALID);149 CHECK_RET(CheckFormat(x, out), ACLNN_ERR_PARAM_INVALID);
@@ -123,6 +123,28 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
123{123{
124 // 1. 检查参数是否为空指针124 // 1. 检查参数是否为空指针
125 CHECK_RET(CheckNotNull(x1, x2, out), ACLNN_ERR_PARAM_NULLPTR);125 CHECK_RET(CheckNotNull(x1, x2, out), ACLNN_ERR_PARAM_NULLPTR);
126+ 
127+ // Check every entry in tensor lists is not null, to avoid null pointer
128+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
129+ for (uint64_t i = 0; i < x1->Size(); i++) {
130+ if ((*x1)[i] == nullptr) {
131+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x1[%lu] is null.", i);
132+ return ACLNN_ERR_PARAM_INVALID;
133+ }
134+ }
135+ for (uint64_t i = 0; i < x2->Size(); i++) {
136+ if ((*x2)[i] == nullptr) {
137+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
138+ return ACLNN_ERR_PARAM_INVALID;
139+ }
140+ }
141+ for (uint64_t i = 0; i < out->Size(); i++) {
142+ if ((*out)[i] == nullptr) {
143+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
144+ return ACLNN_ERR_PARAM_INVALID;
145+ }
146+ }
147+ 
126 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内148 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内
127 CHECK_RET(CheckDtypeValid(x1, x2, out), ACLNN_ERR_PARAM_INVALID);149 CHECK_RET(CheckDtypeValid(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
128 // 3. 检查shape是否满足约束150 // 3. 检查shape是否满足约束
@@ -115,6 +115,22 @@ static inline bool CheckShape(const aclTensorList* self, const aclTensorList* ou
115static inline aclnnStatus CheckParams(const aclTensorList* self, const aclTensor* scalar, const aclTensorList* out)115static inline aclnnStatus CheckParams(const aclTensorList* self, const aclTensor* scalar, const aclTensorList* out)
116{116{
117 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);117 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
118+ 
119+ // Check every entry in tensor lists is not null, to avoid null pointer
120+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
121+ for (uint64_t i = 0; i < self->Size(); i++) {
122+ if ((*self)[i] == nullptr) {
123+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
124+ return ACLNN_ERR_PARAM_INVALID;
125+ }
126+ }
127+ for (uint64_t i = 0; i < out->Size(); i++) {
128+ if ((*out)[i] == nullptr) {
129+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
130+ return ACLNN_ERR_PARAM_INVALID;
131+ }
132+ }
133+ 
118 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);134 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
119 CHECK_RET(CheckShape(self, out), ACLNN_ERR_PARAM_INVALID);135 CHECK_RET(CheckShape(self, out), ACLNN_ERR_PARAM_INVALID);
120 CHECK_RET(CheckFormat(self, out), ACLNN_ERR_PARAM_INVALID);136 CHECK_RET(CheckFormat(self, out), ACLNN_ERR_PARAM_INVALID);
@@ -119,6 +119,16 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
119 // 1. 检查参数是否为空指针119 // 1. 检查参数是否为空指针
120 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);120 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
121 CHECK_RET(self->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);121 CHECK_RET(self->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);
122+ 
123+ // Check every entry in tensor lists is not null, to avoid null pointer
124+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
125+ for (uint64_t i = 0; i < self->Size(); i++) {
126+ if ((*self)[i] == nullptr || (*out)[i] == nullptr) {
127+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "Tensor entry at index %lu is null.", i);
128+ return ACLNN_ERR_PARAM_INVALID;
129+ }
130+ }
131+ 
122 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验132 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
123 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);133 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
124 // 3. 检查shape是否满足约束134 // 3. 检查shape是否满足约束
@@ -123,6 +123,34 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
123 const aclTensorList* out)123 const aclTensorList* out)
124{124{
125 CHECK_RET(CheckNotNull(x1, x2, weight, out), ACLNN_ERR_PARAM_NULLPTR);125 CHECK_RET(CheckNotNull(x1, x2, weight, out), ACLNN_ERR_PARAM_NULLPTR);
126+ 
127+ // Check every entry in tensor lists is not null, to avoid null pointer
128+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
129+ for (uint64_t i = 0; i < x1->Size(); i++) {
130+ if ((*x1)[i] == nullptr) {
131+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x1[%lu] is null.", i);
132+ return ACLNN_ERR_PARAM_INVALID;
133+ }
134+ }
135+ for (uint64_t i = 0; i < x2->Size(); i++) {
136+ if ((*x2)[i] == nullptr) {
137+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
138+ return ACLNN_ERR_PARAM_INVALID;
139+ }
140+ }
141+ for (uint64_t i = 0; i < weight->Size(); i++) {
142+ if ((*weight)[i] == nullptr) {
143+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "weight[%lu] is null.", i);
144+ return ACLNN_ERR_PARAM_INVALID;
145+ }
146+ }
147+ for (uint64_t i = 0; i < out->Size(); i++) {
148+ if ((*out)[i] == nullptr) {
149+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
150+ return ACLNN_ERR_PARAM_INVALID;
151+ }
152+ }
153+ 
126 CHECK_RET(CheckDtypeValid(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);154 CHECK_RET(CheckDtypeValid(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);
127 CHECK_RET(CheckShape(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);155 CHECK_RET(CheckShape(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);
128 CHECK_RET(CheckFormat(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);156 CHECK_RET(CheckFormat(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);
@@ -125,6 +125,16 @@ static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorLi
125 CHECK_RET(CheckNotNull(x1, x2, weight, out), ACLNN_ERR_PARAM_NULLPTR);125 CHECK_RET(CheckNotNull(x1, x2, weight, out), ACLNN_ERR_PARAM_NULLPTR);
126 CHECK_RET(x1->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);126 CHECK_RET(x1->Size() == x2->Size(), ACLNN_ERR_PARAM_INVALID);
127 CHECK_RET(x1->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);127 CHECK_RET(x1->Size() == out->Size(), ACLNN_ERR_PARAM_INVALID);
128+ 
129+ // Check every entry in tensor lists is not null, to avoid null pointer
130+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
131+ for (uint64_t i = 0; i < x1->Size(); i++) {
132+ if ((*x1)[i] == nullptr || (*x2)[i] == nullptr || (*out)[i] == nullptr) {
133+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "Tensor entry at index %lu in input/output tensor list is null.", i);
134+ return ACLNN_ERR_PARAM_INVALID;
135+ }
136+ }
137+ 
128 CHECK_RET(CheckDtypeValid(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);138 CHECK_RET(CheckDtypeValid(x1, x2, weight, out), ACLNN_ERR_PARAM_INVALID);
129 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);139 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
130 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);140 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
@@ -132,6 +132,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
132{132{
133 // 1. 检查参数是否为空指针133 // 1. 检查参数是否为空指针
134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
135+ 
136+ // Check every entry in tensor lists is not null, to avoid null pointer
137+ // dereference in CheckDtypeValid/CheckShapeValid/CheckFormat.
138+ for (uint64_t i = 0; i < self->Size(); i++) {
139+ if ((*self)[i] == nullptr) {
140+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
141+ return ACLNN_ERR_PARAM_INVALID;
142+ }
143+ }
144+ for (uint64_t i = 0; i < out->Size(); i++) {
145+ if ((*out)[i] == nullptr) {
146+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
147+ return ACLNN_ERR_PARAM_INVALID;
148+ }
149+ }
150+ 
135 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验151 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
136 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);152 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
137 // 3. 检查shape是否满足约束153 // 3. 检查shape是否满足约束
@@ -131,6 +131,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
131{131{
132 // 1. 检查参数是否为空指针132 // 1. 检查参数是否为空指针
133 CHECK_RET(CheckNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);133 CHECK_RET(CheckNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
134+ 
135+ // Check every entry in tensor lists is not null, to avoid null pointer
136+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
137+ for (uint64_t i = 0; i < self->Size(); i++) {
138+ if ((*self)[i] == nullptr) {
139+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
140+ return ACLNN_ERR_PARAM_INVALID;
141+ }
142+ }
143+ for (uint64_t i = 0; i < out->Size(); i++) {
144+ if ((*out)[i] == nullptr) {
145+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
146+ return ACLNN_ERR_PARAM_INVALID;
147+ }
148+ }
149+ 
134 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验150 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
135 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);151 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
136 // 3. 检查shape是否满足约束152 // 3. 检查shape是否满足约束
@@ -118,6 +118,28 @@ static inline bool CheckShape(const aclTensorList* x1, const aclTensorList* x2,
118static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorList* x2, const aclTensorList* out)118static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorList* x2, const aclTensorList* out)
119{119{
120 CHECK_RET(CheckNotNull(x1, x2, out), ACLNN_ERR_PARAM_NULLPTR);120 CHECK_RET(CheckNotNull(x1, x2, out), ACLNN_ERR_PARAM_NULLPTR);
121+ 
122+ // Check every entry in tensor lists is not null, to avoid null pointer
123+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
124+ for (uint64_t i = 0; i < x1->Size(); i++) {
125+ if ((*x1)[i] == nullptr) {
126+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x1[%lu] is null.", i);
127+ return ACLNN_ERR_PARAM_INVALID;
128+ }
129+ }
130+ for (uint64_t i = 0; i < x2->Size(); i++) {
131+ if ((*x2)[i] == nullptr) {
132+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
133+ return ACLNN_ERR_PARAM_INVALID;
134+ }
135+ }
136+ for (uint64_t i = 0; i < out->Size(); i++) {
137+ if ((*out)[i] == nullptr) {
138+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
139+ return ACLNN_ERR_PARAM_INVALID;
140+ }
141+ }
142+ 
121 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);143 CHECK_RET(CheckShape(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
122 CHECK_RET(CheckDtypeValid(x1, x2, out), ACLNN_ERR_PARAM_INVALID);144 CHECK_RET(CheckDtypeValid(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
123 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);145 CHECK_RET(CheckFormat(x1, x2, out), ACLNN_ERR_PARAM_INVALID);
@@ -132,6 +132,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
132{132{
133 // 1. 检查参数是否为空指针133 // 1. 检查参数是否为空指针
134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
135+ 
136+ // Check every entry in tensor lists is not null, to avoid null pointer
137+ // dereference in CheckDtype/CheckShape/CheckFormat.
138+ for (uint64_t i = 0; i < self->Size(); i++) {
139+ if ((*self)[i] == nullptr) {
140+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
141+ return ACLNN_ERR_PARAM_INVALID;
142+ }
143+ }
144+ for (uint64_t i = 0; i < out->Size(); i++) {
145+ if ((*out)[i] == nullptr) {
146+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
147+ return ACLNN_ERR_PARAM_INVALID;
148+ }
149+ }
150+ 
135 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验151 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
136 CHECK_RET(CheckDtype(self, scalar, out), ACLNN_ERR_PARAM_INVALID);152 CHECK_RET(CheckDtype(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
137 // 3. 检查shape是否满足约束153 // 3. 检查shape是否满足约束
@@ -121,6 +121,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
121{121{
122 // 1. 检查参数是否为空指针122 // 1. 检查参数是否为空指针
123 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);123 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
124+ 
125+ // Check every entry in tensor lists is not null, to avoid null pointer
126+ // dereference in CheckDtypePowScalar/CheckShape/CheckFormat.
127+ for (uint64_t i = 0; i < self->Size(); i++) {
128+ if ((*self)[i] == nullptr) {
129+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
130+ return ACLNN_ERR_PARAM_INVALID;
131+ }
132+ }
133+ for (uint64_t i = 0; i < out->Size(); i++) {
134+ if ((*out)[i] == nullptr) {
135+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
136+ return ACLNN_ERR_PARAM_INVALID;
137+ }
138+ }
139+ 
124 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验140 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
125 CHECK_RET(CheckDtypePowScalar(self, scalar, out), ACLNN_ERR_PARAM_INVALID);141 CHECK_RET(CheckDtypePowScalar(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
126 // 3. 检查shape是否满足约束142 // 3. 检查shape是否满足约束
@@ -120,6 +120,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
120{120{
121 // 1. 检查参数是否为空指针121 // 1. 检查参数是否为空指针
122 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);122 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
123+ 
124+ // Check every entry in tensor lists is not null, to avoid null pointer
125+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
126+ for (uint64_t i = 0; i < self->Size(); i++) {
127+ if ((*self)[i] == nullptr) {
128+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
129+ return ACLNN_ERR_PARAM_INVALID;
130+ }
131+ }
132+ for (uint64_t i = 0; i < out->Size(); i++) {
133+ if ((*out)[i] == nullptr) {
134+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
135+ return ACLNN_ERR_PARAM_INVALID;
136+ }
137+ }
138+ 
123 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验139 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
124 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);140 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
125 // 3. 检查shape是否满足约束141 // 3. 检查shape是否满足约束
@@ -109,6 +109,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclTensor
109{109{
110 // 1. 检查参数是否为空指针110 // 1. 检查参数是否为空指针
111 CHECK_RET(CheckNotNull(self, out), ACLNN_ERR_PARAM_NULLPTR);111 CHECK_RET(CheckNotNull(self, out), ACLNN_ERR_PARAM_NULLPTR);
112+ 
113+ // Check every entry in tensor lists is not null, to avoid null pointer
114+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
115+ for (uint64_t i = 0; i < self->Size(); i++) {
116+ if ((*self)[i] == nullptr) {
117+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
118+ return ACLNN_ERR_PARAM_INVALID;
119+ }
120+ }
121+ for (uint64_t i = 0; i < out->Size(); i++) {
122+ if ((*out)[i] == nullptr) {
123+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
124+ return ACLNN_ERR_PARAM_INVALID;
125+ }
126+ }
127+ 
112 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内128 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内
113 CHECK_RET(CheckDtypeValid(self, out), ACLNN_ERR_PARAM_INVALID);129 CHECK_RET(CheckDtypeValid(self, out), ACLNN_ERR_PARAM_INVALID);
114 // 3. 检查shape是否满足约束130 // 3. 检查shape是否满足约束
@@ -158,6 +158,28 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclTensor
158{158{
159 // 1. 检查参数是否为空指针159 // 1. 检查参数是否为空指针
160 CHECK_RET(CheckNotNull(self, x2, scalar, out), ACLNN_ERR_PARAM_NULLPTR);160 CHECK_RET(CheckNotNull(self, x2, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
161+ 
162+ // Check every entry in tensor lists is not null, to avoid null pointer
163+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
164+ for (uint64_t i = 0; i < self->Size(); i++) {
165+ if ((*self)[i] == nullptr) {
166+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
167+ return ACLNN_ERR_PARAM_INVALID;
168+ }
169+ }
170+ for (uint64_t i = 0; i < x2->Size(); i++) {
171+ if ((*x2)[i] == nullptr) {
172+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "x2[%lu] is null.", i);
173+ return ACLNN_ERR_PARAM_INVALID;
174+ }
175+ }
176+ for (uint64_t i = 0; i < out->Size(); i++) {
177+ if ((*out)[i] == nullptr) {
178+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
179+ return ACLNN_ERR_PARAM_INVALID;
180+ }
181+ }
182+ 
161 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验183 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
162 CHECK_RET(CheckDtypeValid(self, x2, scalar, out), ACLNN_ERR_PARAM_INVALID);184 CHECK_RET(CheckDtypeValid(self, x2, scalar, out), ACLNN_ERR_PARAM_INVALID);
163 // 3. 检查shape是否满足约束185 // 3. 检查shape是否满足约束
@@ -132,7 +132,22 @@ static inline aclnnStatus CheckParams(const aclTensorList* self, const aclScalar
132{132{
133 // 1. 检查参数是否为空指针133 // 1. 检查参数是否为空指针
134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);134 CHECK_RET(CheckNotNull(self, scalar, out), ACLNN_ERR_PARAM_NULLPTR);
135- ;135+ 
136+ // Check every entry in tensor lists is not null, to avoid null pointer
137+ // dereference in CheckDtypeValid/CheckShape/CheckFormat.
138+ for (uint64_t i = 0; i < self->Size(); i++) {
139+ if ((*self)[i] == nullptr) {
140+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "self[%lu] is null.", i);
141+ return ACLNN_ERR_PARAM_INVALID;
142+ }
143+ }
144+ for (uint64_t i = 0; i < out->Size(); i++) {
145+ if ((*out)[i] == nullptr) {
146+ OP_LOGE(ACLNN_ERR_PARAM_INVALID, "out[%lu] is null.", i);
147+ return ACLNN_ERR_PARAM_INVALID;
148+ }
149+ }
150+ 
136 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验151 // 2. 检查输入的数据类型是否在API支持的数据类型范围之内,需要根据api定义校验
137 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);152 CHECK_RET(CheckDtypeValid(self, scalar, out), ACLNN_ERR_PARAM_INVALID);
138 // 3. 检查shape是否满足约束153 // 3. 检查shape是否满足约束