已合并
fix: 为foreach手写aclnn算子补充tensor list空元素检查 #9494
luoyufan7创建于 8月29日
fix: 为foreach手写aclnn算子补充tensor list空元素检查 #9494
已合并
共 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) | |||
| 128 | static inline aclnnStatus CheckParams(const aclTensorList* x, const aclTensorList* out) | 128 | static 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 | |||
| 115 | static inline aclnnStatus CheckParams(const aclTensorList* self, const aclTensor* scalar, const aclTensorList* out) | 115 | static 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, | |||
| 118 | static inline aclnnStatus CheckParams(const aclTensorList* x1, const aclTensorList* x2, const aclTensorList* out) | 118 | static 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是否满足约束 |