Expression::Compare(const Expression &e) 在第181行执行 impl_->Compare(*e.impl_),仅校验了 this->impl_(第180行 if (impl_ != nullptr))未校验 e.impl_。e 为函数入参,其 impl_ 可能为空:Expression 可通过 Expression(ExpressionImplPtr &&e) 构造函数(第269行)传入空指针(如 Expression(nullptr));Expression::Parse 在 str 为 nullptr 时返回 Expression(nullptr)(第73行);Expression::Deserialize 在解析失败时返回空 impl_(expression_impl.cc:219)。此外 ComGraphMakeUnique() 使用 new(std::nothrow)(ge_util.h:57)也可能返回空。同文件 operator==(第252行)同时校验了 impl_ 和 e.impl_(if (impl_ != nullptr && e.impl_ != nullptr)),表明 Compare 遗漏了对 e.impl_ 的校验。Compare 被用于排序比较器(attr_group_shape_env.h:95 SymbolCheckInfoKeyLess、symbolic.h:314),若含空 impl_ 的 Expression 进入有序容器将触发比较并崩溃。
经复核:(1) 模式成立——expression.cc:180 仅校验 impl_!=nullptr(this),未校验 e.impl_,第181行 impl_->Compare(*e.impl_) 解引用 e.impl_;同文件 operator==(第252行)同时校验 impl_ 和 e.impl_,证实校验必要且 Compare 遗漏。 (2) 无有效防护——对 e.impl_ 无校验。 (3) 函数可达——call_sites 确认 symbolic.h:314 ExpressionKeyLess 比较器 return x.Compare(y)==-1,attr_group_shape_env.h:95 SymbolCheckInfoKeyLess 比较器 return a.expr.Compare(b.expr)<0,均用于有序容器排序。 (4) 触发条件无法证实满足——e.impl_ 可能为空(Parse(nullptr) 返回 Expression(nullptr) 第73行、Expression(nullptr) 构造第269行、Deserialize 失败、ComGraphMakeUnique OOM),但 null-impl Expression 是否实际进入有序容器触发比较器调用未证实,比较器实参 x/y 是否含 null impl_ 模糊。 判定为假设性缺陷,调用方实参存在模糊(可能触发未证实),对应 confidence 0.86。
Source(问题源头) autofuse/graph_metadef/graph/expression/expression.cc:269 行 Expression::Expression(ExpressionImplPtr &&e) : impl_(std::move(e)) 构造函数可接收空 ExpressionImplPtr(如 Expression(nullptr)),使 impl_ 为空
Source(问题源头)
autofuse/graph_metadef/graph/expression/expression.cc:269 行 Expression::Expression(ExpressionImplPtr &&e) : impl_(std::move(e)) 构造函数可接收空 ExpressionImplPtr(如 Expression(nullptr)),使 impl_ 为空
Sink(问题爆发点) autofuse/graph_metadef/graph/expression/expression.cc:181 行 return impl_->Compare(*e.impl_) e.impl_ 未经空指针校验通过 *e.impl_ 解引用(空指针解引用 sink)
Sink(问题爆发点)
autofuse/graph_metadef/graph/expression/expression.cc:181 行 return impl_->Compare(*e.impl_) e.impl_ 未经空指针校验通过 *e.impl_ 解引用(空指针解引用 sink)
传播路径:
int64_t Expression::Compare(const Expression &e) const { if ((impl_ != nullptr) && (e.impl_ != nullptr)) { return impl_->Compare(*e.impl_); } return std::numeric_limits<int64_t>::max(); }
你好,感谢建议, 后续分析处理
缺陷信息
缺陷描述
Expression::Compare(const Expression &e) 在第181行执行 impl_->Compare(*e.impl_),仅校验了 this->impl_(第180行 if (impl_ != nullptr))未校验 e.impl_。e 为函数入参,其 impl_ 可能为空:Expression 可通过 Expression(ExpressionImplPtr &&e) 构造函数(第269行)传入空指针(如 Expression(nullptr));Expression::Parse 在 str 为 nullptr 时返回 Expression(nullptr)(第73行);Expression::Deserialize 在解析失败时返回空 impl_(expression_impl.cc:219)。此外 ComGraphMakeUnique() 使用 new(std::nothrow)(ge_util.h:57)也可能返回空。同文件 operator==(第252行)同时校验了 impl_ 和 e.impl_(if (impl_ != nullptr && e.impl_ != nullptr)),表明 Compare 遗漏了对 e.impl_ 的校验。Compare 被用于排序比较器(attr_group_shape_env.h:95 SymbolCheckInfoKeyLess、symbolic.h:314),若含空 impl_ 的 Expression 进入有序容器将触发比较并崩溃。
事实核查
数据流证据
传播路径:
修复建议
int64_t Expression::Compare(const Expression &e) const { if ((impl_ != nullptr) && (e.impl_ != nullptr)) { return impl_->Compare(*e.impl_); } return std::numeric_limits<int64_t>::max(); }