github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/report/crash/types.go (about)

     1  // Copyright 2023 syzkaller project authors. All rights reserved.
     2  // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
     3  
     4  package crash
     5  
     6  import "slices"
     7  
     8  type Type string
     9  
    10  const (
    11  	UnknownType = Type("")
    12  	// keep-sorted start
    13  	AtomicSleep             = Type("ATOMIC_SLEEP")
    14  	Bug                     = Type("BUG")
    15  	DoS                     = Type("DoS")
    16  	Hang                    = Type("HANG")
    17  	KASANInvalidFree        = Type("KASAN-INVALID-FREE")
    18  	KASANNullPtrDerefRead   = Type("KASAN-NULL-POINTER-DEREFERENCE-READ")
    19  	KASANNullPtrDerefWrite  = Type("KASAN-NULL-POINTER-DEREFERENCE-WRITE")
    20  	KASANRead               = Type("KASAN-READ")
    21  	KASANUnknown            = Type("KASAN-UNKNOWN")
    22  	KASANUseAfterFreeRead   = Type("KASAN-USE-AFTER-FREE-READ")
    23  	KASANUseAfterFreeWrite  = Type("KASAN-USE-AFTER-FREE-WRITE")
    24  	KASANWrite              = Type("KASAN-WRITE")
    25  	KCSANAssert             = Type("KCSAN-ASSERT")
    26  	KCSANDataRace           = Type("KCSAN-DATARACE")
    27  	KCSANUnknown            = Type("KCSAN-UNKNOWN")
    28  	KFENCEInvalidFree       = Type("KFENCE-INVALID-FREE")
    29  	KFENCEMemoryCorruption  = Type("KFENCE-MEMORY-CORRUPTION")
    30  	KFENCERead              = Type("KFENCE-READ")
    31  	KFENCEUnknown           = Type("KFENCE-UNKNOWN")
    32  	KFENCEUseAfterFreeRead  = Type("KFENCE-USE-AFTER-FREE-READ")
    33  	KFENCEUseAfterFreeWrite = Type("KFENCE-USE-AFTER-FREE-WRITE")
    34  	KFENCEWrite             = Type("KFENCE-WRITE")
    35  	KMSANInfoLeak           = Type("KMSAN-INFO-LEAK")
    36  	KMSANUninitValue        = Type("KMSAN-UNINIT-VALUE")
    37  	KMSANUnknown            = Type("KMSAN-UNKNOWN")
    38  	KMSANUseAfterFreeRead   = Type("KMSAN-USE-AFTER-FREE-READ")
    39  	LockdepBug              = Type("LOCKDEP")
    40  	MemoryLeak              = Type("LEAK")
    41  	MemorySafetyBUG         = Type("MEMORY_SAFETY_BUG")
    42  	MemorySafetyUBSAN       = Type("MEMORY_SAFETY_UBSAN")
    43  	NullPtrDerefBUG         = Type("NULL-POINTER-DEREFERENCE")
    44  	RefcountWARNING         = Type("REFCOUNT_WARNING")
    45  	UBSAN                   = Type("UBSAN")
    46  	Warning                 = Type("WARNING")
    47  	// keep-sorted end
    48  	LostConnection   = Type("LOST_CONNECTION")
    49  	SyzFailure       = Type("SYZ_FAILURE")
    50  	UnexpectedReboot = Type("REBOOT")
    51  )
    52  
    53  func (t Type) String() string {
    54  	if t == UnknownType {
    55  		return "UNKNOWN"
    56  	}
    57  	return string(t)
    58  }
    59  
    60  type TypeGroupPred func(Type) bool
    61  
    62  func (t Type) IsKASAN() bool {
    63  	return slices.Contains([]Type{
    64  		KASANNullPtrDerefRead, KASANNullPtrDerefWrite, KASANRead, KASANWrite,
    65  		KASANUseAfterFreeRead, KASANUseAfterFreeWrite, KASANInvalidFree, KASANUnknown}, t)
    66  }
    67  
    68  func (t Type) IsKMSAN() bool {
    69  	return slices.Contains([]Type{
    70  		KMSANUninitValue, KMSANInfoLeak, KMSANUseAfterFreeRead, KMSANUnknown}, t)
    71  }
    72  
    73  func (t Type) IsKCSAN() bool {
    74  	return t == KCSANDataRace || t == KCSANAssert || t == KCSANUnknown
    75  }
    76  
    77  func (t Type) IsUBSAN() bool {
    78  	return t == UBSAN || t == MemorySafetyUBSAN
    79  }
    80  
    81  func (t Type) IsBUG() bool {
    82  	return slices.Contains([]Type{Bug, MemorySafetyBUG, NullPtrDerefBUG}, t)
    83  }
    84  
    85  func (t Type) IsWarning() bool {
    86  	return t == Warning || t == RefcountWARNING
    87  }
    88  
    89  func (t Type) IsBugOrWarning() bool {
    90  	return t.IsBUG() || t.IsWarning()
    91  }
    92  
    93  func (t Type) IsMemSafety() bool {
    94  	return t == MemorySafetyBUG || t == RefcountWARNING || t == MemorySafetyUBSAN
    95  }
    96  
    97  func (t Type) IsMemoryLeak() bool {
    98  	return t == MemoryLeak
    99  }
   100  
   101  func (t Type) IsLockingBug() bool {
   102  	return t.IsLockdep() || t.IsAtomicSleep()
   103  }
   104  
   105  func (t Type) IsDoS() bool {
   106  	return t == Bug || t == DoS
   107  }
   108  
   109  func (t Type) IsHang() bool {
   110  	return t == Hang
   111  }
   112  
   113  func (t Type) IsLockdep() bool {
   114  	return t == LockdepBug
   115  }
   116  
   117  func (t Type) IsAtomicSleep() bool {
   118  	return t == AtomicSleep
   119  }