| 223 | } |
| 224 | |
| 225 | void VarSanityCheck::check_single_input( |
| 226 | bool add_debug_log, cg::OperatorNodeBase* recv_opr, VarNode* var) { |
| 227 | if (var->contain_flag(VarNode::Flag::DISALLOW_VAR_SANITY_CHECK)) |
| 228 | return; |
| 229 | |
| 230 | auto checksum = calc_checksum(var); |
| 231 | |
| 232 | ChecksumResult checksum_expect; |
| 233 | { |
| 234 | MGB_LOCK_GUARD(m_id2chksum_mtx); |
| 235 | auto&& node_prop = recv_opr->node_prop(); |
| 236 | if (node_prop.contain( |
| 237 | cg::OperatorNodeBase::NodeProp::Flag::FORCE_UPDATE_INPUT_VAR)) { |
| 238 | m_modified_vars.insert(var); |
| 239 | } |
| 240 | auto chk_iter = m_var2chksum.find(var); |
| 241 | if (chk_iter == m_var2chksum.end()) { |
| 242 | // PERSISTENT_DEVICE_VALUE vars can be read by oprs on other comp |
| 243 | // nodes without being waited on |
| 244 | mgb_assert( |
| 245 | var->contain_flag(VarNode::Flag::PERSISTENT_DEVICE_VALUE), |
| 246 | "var checksum uncomputed, and its owner opr is not " |
| 247 | "PERSISTENT_DEVICE_VALUE: %s", |
| 248 | cg::dump_var_info({var}).c_str()); |
| 249 | auto rst = m_var2chksum.emplace(var, checksum); |
| 250 | mgb_assert(rst.second); |
| 251 | return; |
| 252 | } else { |
| 253 | checksum_expect = chk_iter->second; |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | if (add_debug_log) { |
| 258 | m_debug_log.on_var_received(var); |
| 259 | } |
| 260 | |
| 261 | if (checksum != checksum_expect) { |
| 262 | #if MGB_ENABLE_GETENV |
| 263 | mgb_throw( |
| 264 | Error, |
| 265 | "var sanity check failed: var: %s" |
| 266 | " (checksum: expect=%s got=%s); receiver: %s{%s}(%zu);" |
| 267 | " you can set " LOG_DETAILS_ENV_VAR_NAME |
| 268 | "=%zu to get more details; pass=%d", |
| 269 | cg::dump_var_info({var}).c_str(), str(checksum_expect).c_str(), |
| 270 | str(checksum).c_str(), recv_opr->cname(), |
| 271 | recv_opr->dyn_typeinfo()->name, recv_opr->id(), var->id(), |
| 272 | !add_debug_log); |
| 273 | #else |
| 274 | mgb_throw( |
| 275 | Error, |
| 276 | "var sanity check failed: var: %s" |
| 277 | " (checksum: expect=%s got=%s); receiver: %s{%s}(%zu);", |
| 278 | cg::dump_var_info({var}).c_str(), str(checksum_expect).c_str(), |
| 279 | str(checksum).c_str(), recv_opr->cname(), |
| 280 | recv_opr->dyn_typeinfo()->name, recv_opr->id()); |
| 281 | #endif |
| 282 | } |
nothing calls this directly
no test coverage detected