Fix integer division by zero crash in CPU EP Div operator (#27693)
### Description
Add a pre-check for zero values in the divisor tensor for integral types
in `Div<T>`. Returns an error `Status` instead of hitting undefined
behavior (SIGFPE / structured exception).
- **`element_wise_ops.h`**: When the divisor is a constant initializer,
`TryGetConstantInput` validates for zeros once at kernel creation time
in the constructor, avoiding per-`Compute` overhead. A
`divisor_is_validated_constant_` flag tracks whether the one-time check
was performed.
- **`element_wise_ops.cc`**: `if constexpr (std::is_integral<T>::value)`
guard scans non-constant divisors before calling `UntypedBroadcastTwo`,
skipping the check when the constant was already validated. Compiled
away for float/double/half — zero cost for non-integer paths.
- **`element_wise_ops_test.cc`**: Added `Div_int8_by_zero`,
`Div_int32_by_zero`, `Div_int64_by_zero_scalar` tests covering tensor
and scalar divisor cases, plus `Div_int32_by_zero_constant_initializer`
to exercise the `TryGetConstantInput` constructor path with
`is_initializer = true`.
### Motivation and Context
Integer division by zero is UB in C++ and causes a hardware exception
that crashes the process. Float types produce inf/NaN naturally, but
int8/int16/int32/int64/uint* types do not. This was reported via
Chromium (https://issues.chromium.org/issues/491835014) with a trivial
repro: `tensor<int8> / scalar(0)`.
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
>
> ----
>
> *This section details on the original issue you should resolve*
>
> <issue_title>int8 / 0 exception not caught for cpu ep</issue_title>
> <issue_description>See https://issues.chromium.org/issues/491835014.
>
> Repro:
> a=tensor<int8>
> b=tensor<int8>, ie a scalar that is 0
> model that does a/b
>
> Stack trace:
> ```
> onnxruntime.dll!Eigen::internal::scalar_quotient_op<signed char,signed
char>::operator()(const char &) Line 437 C++
> [Inline Frame]
onnxruntime.dll!Eigen::internal::binary_evaluator<Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<signed
char,signed
char>,Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<signed
char>,Eigen::Array<signed char,-1,1,0,-1,1> const> const
,Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<signed char,-1,1,0,-1,1>
const ,0,Eigen::Stride<0,0>>>
const>,Eigen::internal::IndexBased,Eigen::internal::IndexBased,signed
char,signed char>::coeff(__int64) Line 910 C++
> ...
> [Inline Frame]
onnxruntime.dll!Eigen::internal::Assignment<Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>>,Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<signed
char,signed
char>,Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<signed
char>,Eigen::Array<signed char,-1,1,0,-1,1> const> const
,Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<signed char,-1,1,0,-1,1>
const ,0,Eigen::Stride<0,0>>> const>,Eigen::internal::assign_op<signed
char,signed
char>,Eigen::internal::Dense2Dense,void>::run(Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>> &) Line 855 C++
> [Inline Frame]
onnxruntime.dll!Eigen::internal::call_assignment_no_alias(Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>> &) Line 797 C++
> [Inline Frame]
onnxruntime.dll!Eigen::internal::call_assignment(Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>> &) Line 768 C++
> [Inline Frame]
onnxruntime.dll!Eigen::internal::call_assignment(Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>> &) Line 750 C++
> [Inline Frame]
onnxruntime.dll!Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<signed
char,-1,1,0,-1,1>,0,Eigen::Stride<0,0>>>::operator=(const
Eigen::DenseBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<signed
char,signed
char>,Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<signed
char>,Eigen::Array<signed char,-1,1,0,-1,1> const> const
,Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<signed char,-1,1,0,-1,1>
const ,0,Eigen::Stride<0,0>>> const>> &) Line 59 C++
> [Inline Frame] onnxruntime.dll!onnxruntime::Div<signed
char>::Compute::__l2::<lambda_998187df037dec36fd0905b4142c682e>::operator()(onnxruntime::BroadcastHelper
&) Line 685 C++
>
onnxruntime.dll!<lambda_998187df037dec36fd0905b4142c682e>::<lambda_invoker_cdecl>(onnxruntime::BroadcastHelper
& per_iter_bh) Line 686 C++
> [External Code]
> [Inline Frame]
onnxruntime.dll!std::_Func_class<void,__int64,__int64>::operator()(__int64
<_Args_0>, __int64 <_Args_1>) Line 926 C++
>
onnxruntime.dll!onnxruntime::concurrency::ThreadPool::ParallelFor(__int64
n, const onnxruntime::TensorOpCost & c, const std::function<void
__cdecl(__int64,__int64)> & f) Line 628 C++
>
onnxruntime.dll!onnxruntime::concurrency::ThreadPool::TryParallelFor(onnxruntime::concurrency::ThreadPool
* tp, __int64 total, const onnxruntime::TensorOpCost & cost_per_unit,
const std::function<void __cdecl(__int64,__int64)> & fn) Line
705 C++
>
onnxruntime.dll!onnxruntime::ParallelizeSingleSpan<onnxruntime::BroadcastHelper>(onnxruntime::BroadcastHelper
& helper, const onnxruntime::ProcessBroadcastSpanFuncs & functors) Line
955 C++
>
onnxruntime.dll!onnxruntime::BroadcastLooper<onnxruntime::BroadcastHelper>(onnxruntime::BroadcastHelper
& helper, const onnxruntime::ProcessBroadcastSpanFuncs & functors) Line
1006 C++
>
onnxruntime.dll!onnxruntime::UntypedBroadcastTwo(onnxruntime::OpKernelContext
& context, const onnxruntime::ProcessBroadcastSpanFuncs & funcs, double
unit_cost, void * user_data) Line 2305 C++
> onnxruntime.dll!onnxruntime::Div<signed
char>::Compute(onnxruntime::OpKernelContext * context) Line 695 C++
>
> ```
> </issue_description>
>
> ## Comments on the Issue (you are @copilot in this section)
>
> <comments>
> </comments>
>
</details>
<!-- START COPILOT CODING AGENT SUFFIX -->
- Fixes microsoft/onnxruntime#27686
<!-- START COPILOT CODING AGENT TIPS -->
---
📱 Kick off Copilot coding agent tasks wherever you are with [GitHub
Mobile](https://gh.io/cca-mobile-docs), available on iOS and Android.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tianleiwu <30328909+tianleiwu@users.noreply.github.com>
Co-authored-by: skottmckay <979079+skottmckay@users.noreply.github.com>
Co-authored-by: Tianlei Wu <tlwu@microsoft.com>