He-Pin opened a new issue, #3229:
URL: https://github.com/apache/pekko/issues/3229
### Motivation
typed actor 的 `receiveSignal` 处理在特定条件下可能触发 NullPointerException。虽然
`applyOrElse` 有 fallback 处理,但某些边缘场景下 signal 参数可能为 null。
### 当前代码行为
`BehaviorImpl.scala` 中:
```scala
// BehaviorImpl.scala:141-145
override def receiveSignal(ctx: ActorContext[T], msg: Signal): Behavior[T] =
{
onSignal.applyOrElse(msg, unhandledSignal)
}
// BehaviorImpl.scala:165-169
override def receiveSignal(ctx: ActorContext[T], msg: Signal): Behavior[T] =
{
onSignal.applyOrElse(msg, unhandledSignal)
}
// BehaviorImpl.scala:75
private val unhandledSignal: PartialFunction[Signal, Behavior[T]] = {
case (_, _) => UnhandledBehavior
}
```
代码看似 null-safe(`unhandledSignal` 有 `case (_, _)` fallback),但在以下场景可能触发 NPE:
- `msg` 参数为 null(框架层面传入 null signal)
- `onSignal` PartialFunction 的 `isDefinedAt` 对 null 抛出异常
### 预期行为
`receiveSignal` 应对 null signal 参数有防御性处理,返回 `UnhandledBehavior` 而非抛出 NPE。
### 代码证据
-
`actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/BehaviorImpl.scala:141-169`
— `ReceiveBehavior` 和 `ReceiveMessageBehavior` 的 `receiveSignal`
-
`actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/BehaviorImpl.scala:75`
— `unhandledSignal` fallback
### 复现方式
需要触发框架层面传入 null signal 的场景,或在自定义 Behavior 中处理 signal 时遇到 null。
### 影响范围
- 模块:`pekko-actor-typed`
- 影响使用自定义 signal handler 的 typed actor
- NPE 可能导致 actor 意外终止
### 备注
此问题需要运行时验证。静态分析显示代码逻辑看似 null-safe,但具体触发条件需要复现。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]