blob: 70d479811bdcef4e5bedd62e2c7592ffe1919d34 [file] [log] [blame] [view]
# Dangling pointer detector.
Dangling pointers are not a problem unless they are dereferenced and used.
However, they are a source of UaF bugs and highly discouraged unless you are
100% confident that they are never dereferenced after the pointed-to objects are
freed.
Behind build flags, Chrome implements a dangling pointer detector. It causes
Chrome to crash, whenever a raw_ptr becomes dangling:
```cpp
raw_ptr<T> ptr_never_dangling;
```
On the other hand, we cannot simply ban all the usage of dangling pointers
because there are valid use cases. The `DisableDanglingPtrDetection` option can
be used to annotate "intentional-and-safe" dangling pointers. It is meant to be
used as a last resort, only if there is no better way to re-architecture the
code.
```cpp
raw_ptr<T, DisableDanglingPtrDetection> ptr_may_dangle;
```
# How to check for dangling pointers?
It is gated behind both build and runtime flags:
## Build flags
```bash
gn args ./out/dangling/
```
```gn
use_goma = true
is_debug = false # Important! (*)
dcheck_always_on = true
enable_backup_ref_ptr_support = true # true by default on most platforms
enable_dangling_raw_ptr_checks = true
```
(*) We want to emphasize that `is_debug = false` is important. It is a common
mistake to set it to `true`, which in turn turns on component builds, which
disables PartitionAlloc-Everywhere. `enable_backup_ref_ptr_support = true` can't
be used without PartitionAlloc-Everywhere, and is silently set to `false`.
## Runtime flags
```bash
./out/dangling/content_shell \
--enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr
```
By default, Chrome will crash on the first dangling raw_ptr detected.
# Runtime flags options:
### Crash (default)
```bash
--enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/crash
```
### Record a list of signatures
Example usage:
```bash
./out/dangling/content_shell \
--enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/log_signature \
|& tee output
```
The logs can be filtered and transformed into a tab separated table:
```bash
cat output \
| grep "DanglingSignature" \
| cut -f2,3 \
| sort \
| uniq -c \
| sed -E 's/^ *//; s/ /\t/' \
| sort -rn
```
This is used to list issues and track progresses.
# DanglingUntriaged
This raw_ptr option means it is allowed to dangle. Contrary to
`DisableDanglingPtrDetection`, we don't know yet why it dangle. It is meant to
be either refactored to avoid dangling, or turned into
"DisableDanglingPtrDetection" with a comment explaining what happens.