blob: 852ec097d81e6bb5e1de0bc0c76565e9a9a2bc7d [file] [view]
# Dawn: Checking asserts [Bug 442860471](https://crbug.com/442860471)
petermcneeley@
Apr 15, 2026
*There has been an influx of security bugs for Dawn due to a capability phase shift in AI-assisted vulnerability discovery.*
In Dawn, often these are triggered by going **outside known assumptions** or they become real security issues when further **assumptions are invalidated**.
## Fix: `DAWN_UNREACHABLE`
A good example of this is the assumption that all switches on enums are valid enums. Some minor vulnerability can lead to full execution control via the undefined behavior of a switch table that jumps to an invalid enum. Example <https://crbug.com/499159695>
To resolve this, all `DAWN_UNREACHABLE`s now check at runtime that unexpected fallthroughs (switch and function) will do a full `CHECK` (as in immediately crash/ICE in release).
This induces ~ 2 instructions per switch and is deemed to be acceptable.
See CL: <https://dawn-review.git.corp.google.com/c/dawn/+/301675>
## Fix: `DAWN_ASSERT` to `DAWN_CHECK`
There are other cases where an assumption would have caught a security issue but does not because the assumption in code is `DAWN_ASSERT`, not a check.
Example <https://crbug.com/500609033>
The conclusion is certain `DAWN_ASSERT`s will be promoted to release `DAWN_CHECK`s.
This is **more controversial** than the unreachable case as some of these checks can be expensive and some can be in hot code paths (paths that are called many times per frame/submit).
For the initial phase, `DAWN_ASSERT`s that will be promoted are:
* Cheap 1-2 instruction checks (null/bounds/error)
* Avoid checks that would be found via null page
* There is no point in checking a null pointer if the very next line it will trigger a null page segfault (which is not considered a Chrome vulnerability)
* Hot code paths are allowed for checking memory bounds
CL: <https://dawn-review.git.corp.google.com/c/dawn/+/302235>
## Fix: `DAWN_ASSERT` to `DAWN_RELEASE_ASSUME`
Previously, in release, `DAWN_ASSERT` was converted into `__builtin_assume`. This is likely a surprise to most developers and can lead to dangerous outcomes.
This `assume` tells the compiler that a specific expression holds. The compiler then can do code generation based on this assumption.
If the assumption turns out to have been false, the result can be undefined behavior (UB).
Here is an example of `DAWN_ASSERT` being converted to an `assume` and then removing mandatory bounds checks. (This was very BAD)
CL: <https://dawn-review.git.corp.google.com/c/dawn/+/260462>
In conclusion, we should move away from an assert implying an assume, as this can lead to unintended consequences.
The macro `DAWN_ASSERT` will simply assert in debug and be a no-op in release.
For the cases where the intention really was to inform the compiler about assumptions we should use `DAWN_RELEASE_ASSUME`.
## Drawback(s)
The main drawback here is when do we get to remove these checks? **The answer is likely never!**
However, it is likely that within the next year we will be able to ask advanced AI security models what would be the impact of removing specific checks. It might even be that every future change in Dawn will get evaluated for security by an AI model.