Fix XNNPACK Gemm SIGSEGV on missing and scalar 'C' bias (#28546)
### Description
Hardens the XNNPACK Gemm capability check against two SIGSEGV crashes
during graph partitioning: one when the optional `C` input is omitted,
one when `C` is a rank-0 (scalar) tensor. The check now guards the null
`C` arg before calling `Shape()`, and rejects rank-0 `C` so the node
falls back to the CPU EP cleanly.
Thanks @kadu-v, the minimal Python repros made the root cause easy to
confirm. Both reproduced as a hard crash on the first `InferenceSession`
construction.
### Motivation and Context
Fixes #28541
Fixes #28542
`Gemm::IsOnnxNodeSupported` dereferenced `C_arg->Shape()` without
checking whether `C_arg` was non-null, so any Gemm without the optional
bias segfaulted before the EP could decline the node. A rank-0 `C` then
survived the existing checks and reached XNNPACK's fully-connected path,
which doesn't implement scalar broadcast (there's already a TODO in that
file noting it). That's the second SIGSEGV.
### Changes
`onnxruntime/core/providers/xnnpack/math/gemm.cc`:
- Null-check `C_arg` before reading its shape. Absent `C` is valid per
the Gemm spec; treat it as "no bias".
- Reject `C` with rank 0 from `IsOnnxNodeSupported` so the node falls
through to CPU. Adding scalar broadcast support belongs with the TODO in
the fully-connected path, not in the capability check.
### Testing
Three regression tests in
`onnxruntime/test/providers/xnnpack/xnnpack_basic_test.cc`:
- `TestGemm_NoC_NoSegfault` builds a Gemm with the `C` input omitted.
- `TestGemm_ScalarC_NoSegfault` builds a Gemm with a rank-0 `C`.
- `TestGemm_EmptyC_NoSegfault` covers an empty-shape `C` edge case.
Each test loads an `InferenceSession` with the XNNPACK EP registered and
asserts no crash.
I also suspect `Gemm`'s constructor has pre-existing crashes when `A` or
`B` is 1-D, before the capability check even runs. Haven't reproduced
it. Can file a follow-up if useful.
Signed-off-by: Dhruvil <dhruvilparikh79@gmail.com>