module Tokstyle.Analysis.SecurityRank.Types where

import           Data.Map.Strict                        (Map)
import qualified Data.Map.Strict                        as Map
import           Tokstyle.Analysis.SecurityRank.Lattice (SecurityRank)
import           Tokstyle.Analysis.Types                (AbstractLocation,
                                                         Context)

-- | The summary for a function's security rank analysis in a specific context.
data SecurityRankSummaryData = SecurityRankSummaryData
    { -- | Maps an output location (return value or dereferenced pointer param)
      -- to the rank it will be tainted with.
      SecurityRankSummaryData -> Map AbstractLocation SecurityRank
srsOutputRanks  :: Map AbstractLocation SecurityRank
      -- | Maps an input parameter's index to the rank it's expected to have (as a sink).
    , SecurityRankSummaryData -> Map Int SecurityRank
srsSinks        :: Map Int SecurityRank
    , SecurityRankSummaryData -> [String]
srsdDiagnostics :: [String]
    } deriving (Int -> SecurityRankSummaryData -> ShowS
[SecurityRankSummaryData] -> ShowS
SecurityRankSummaryData -> String
(Int -> SecurityRankSummaryData -> ShowS)
-> (SecurityRankSummaryData -> String)
-> ([SecurityRankSummaryData] -> ShowS)
-> Show SecurityRankSummaryData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SecurityRankSummaryData] -> ShowS
$cshowList :: [SecurityRankSummaryData] -> ShowS
show :: SecurityRankSummaryData -> String
$cshow :: SecurityRankSummaryData -> String
showsPrec :: Int -> SecurityRankSummaryData -> ShowS
$cshowsPrec :: Int -> SecurityRankSummaryData -> ShowS
Show, Eq SecurityRankSummaryData
Eq SecurityRankSummaryData
-> (SecurityRankSummaryData -> SecurityRankSummaryData -> Ordering)
-> (SecurityRankSummaryData -> SecurityRankSummaryData -> Bool)
-> (SecurityRankSummaryData -> SecurityRankSummaryData -> Bool)
-> (SecurityRankSummaryData -> SecurityRankSummaryData -> Bool)
-> (SecurityRankSummaryData -> SecurityRankSummaryData -> Bool)
-> (SecurityRankSummaryData
    -> SecurityRankSummaryData -> SecurityRankSummaryData)
-> (SecurityRankSummaryData
    -> SecurityRankSummaryData -> SecurityRankSummaryData)
-> Ord SecurityRankSummaryData
SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
SecurityRankSummaryData -> SecurityRankSummaryData -> Ordering
SecurityRankSummaryData
-> SecurityRankSummaryData -> SecurityRankSummaryData
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SecurityRankSummaryData
-> SecurityRankSummaryData -> SecurityRankSummaryData
$cmin :: SecurityRankSummaryData
-> SecurityRankSummaryData -> SecurityRankSummaryData
max :: SecurityRankSummaryData
-> SecurityRankSummaryData -> SecurityRankSummaryData
$cmax :: SecurityRankSummaryData
-> SecurityRankSummaryData -> SecurityRankSummaryData
>= :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
$c>= :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
> :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
$c> :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
<= :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
$c<= :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
< :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
$c< :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
compare :: SecurityRankSummaryData -> SecurityRankSummaryData -> Ordering
$ccompare :: SecurityRankSummaryData -> SecurityRankSummaryData -> Ordering
$cp1Ord :: Eq SecurityRankSummaryData
Ord)

-- | The full, context-sensitive security rank summary for a function.
type SecurityRankSummary = Map Context SecurityRankSummaryData

-- Custom Eq instance to ignore diagnostics for fixpoint termination.
instance Eq SecurityRankSummaryData where
    SecurityRankSummaryData
a == :: SecurityRankSummaryData -> SecurityRankSummaryData -> Bool
== SecurityRankSummaryData
b = SecurityRankSummaryData -> Map AbstractLocation SecurityRank
srsOutputRanks SecurityRankSummaryData
a Map AbstractLocation SecurityRank
-> Map AbstractLocation SecurityRank -> Bool
forall a. Eq a => a -> a -> Bool
== SecurityRankSummaryData -> Map AbstractLocation SecurityRank
srsOutputRanks SecurityRankSummaryData
b Bool -> Bool -> Bool
&&
             SecurityRankSummaryData -> Map Int SecurityRank
srsSinks SecurityRankSummaryData
a Map Int SecurityRank -> Map Int SecurityRank -> Bool
forall a. Eq a => a -> a -> Bool
== SecurityRankSummaryData -> Map Int SecurityRank
srsSinks SecurityRankSummaryData
b

-- | An empty security rank summary data.
emptySecurityRankSummaryData :: SecurityRankSummaryData
emptySecurityRankSummaryData :: SecurityRankSummaryData
emptySecurityRankSummaryData = Map AbstractLocation SecurityRank
-> Map Int SecurityRank -> [String] -> SecurityRankSummaryData
SecurityRankSummaryData Map AbstractLocation SecurityRank
forall k a. Map k a
Map.empty Map Int SecurityRank
forall k a. Map k a
Map.empty []