From 0036885d536b6d49e4f8341b848e965c186c4e97 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 2 May 2017 12:28:48 +0200 Subject: prog: fix dynamic prio calculation Dynamic prio is meant to prioritize calls that are already used together in existing programs. The calculation used call index in the program instead of call ID, which does not make any sense and is a plain bug. It prioritized calls starting from 'a' (as syscalls are sorted). Use call ID for dynamic prio calculation. Static prios for add_key: 1.0000 keyctl$search 1.0000 request_key 1.0000 add_key 0.5411 keyctl$assume_authority 0.5411 keyctl$setperm 0.5411 keyctl$set_timeout 0.5411 keyctl$unlink 0.5411 keyctl$revoke 0.5411 keyctl$reject 0.5411 keyctl$read 0.5411 keyctl$negate 0.5411 keyctl$link 0.5411 keyctl$join 0.5411 keyctl$invalidate 0.5411 keyctl$instantiate_iov 0.5411 keyctl$instantiate 0.5411 keyctl$get_security 0.5411 keyctl$get_persistent 0.5411 keyctl$update Dynamic prios before fix: 0.1000 accept 0.1000 accept$alg 0.1000 accept$ax25 0.1000 accept$inet 0.1000 accept$inet6 0.1000 accept$inet_sctp 0.1000 accept$ipx 0.1000 accept$netrom 0.1000 accept$nfc_llcp 0.1000 accept$unix 0.1000 accept4 0.1000 accept4$ax25 0.1000 accept4$inet 0.1000 accept4$inet6 0.1000 accept4$inet_sctp 0.1000 accept4$ipx 0.1000 accept4$unix 0.1000 acct Dynamic prios after fix: 0.2465 request_key 0.1142 keyctl$search 0.1000 add_key 0.1000 perf_event_open 0.0766 keyctl$invalidate 0.0717 keyctl$setperm 0.0717 keyctl$unlink 0.0717 keyctl$instantiate_iov 0.0681 keyctl$read 0.0649 keyctl$update 0.0649 keyctl$chown 0.0645 keyctl$link 0.0645 keyctl$get_security 0.0631 keyctl$revoke 0.0622 keyctl$clear 0.0622 keyctl$reject 0.0618 keyctl$set_timeout 0.0618 keyctl$negate 0.0613 keyctl$instantiate Fixes #164 --- prog/prio.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/prog/prio.go b/prog/prio.go index d52f55b1c..c9769df5f 100644 --- a/prog/prio.go +++ b/prog/prio.go @@ -140,12 +140,15 @@ func calcDynamicPrio(corpus []*Prog) [][]float32 { prios[i] = make([]float32, len(sys.Calls)) } for _, p := range corpus { - for i0 := 0; i0 < len(p.Calls); i0++ { - for i1 := 0; i1 < len(p.Calls); i1++ { - if i0 == i1 { + for _, c0 := range p.Calls { + for _, c1 := range p.Calls { + id0 := c0.Meta.ID + id1 := c1.Meta.ID + // There are too many mmap's anyway. + if id0 == id1 || c0.Meta.Name == "mmap" || c1.Meta.Name == "mmap" { continue } - prios[i0][i1] += 1.0 + prios[id0][id1] += 1.0 } } } -- cgit mrf-deployment