- A
secret
byte you want to read is stored at inaccessible memory locationpriv_mem
. - The sender triggers an access exception by attempting to read
priv_mem
. - Due to CPU optimization (out-of-order execution), the load of
secret
frompriv_mem
and the use of its value in (4) and (5) below may execute before the exception is triggered. - Calculate an
offset
into a known arrayprobe
by multiplyingsecret
by the width of a cache line (or whatever block size the CPU typically fetches, like a 4096-byte page). This guarantees each of those 256 possible offsets will cache separately. - Load
probe[offset]
, which causes the CPU to cache exactly one chunk of of our array, populating one cache line. - The exception finally triggers, clearing the modified registers...but cached data is not excised.
- Iterate over all 256 offsets into
probe
to find out which one loads fast. You've determined the value ofsecret
.
Describe where the project came from. What is the historical journey of the project; who/what company wrote the project. Did it go through any significant alterations/rewrites/language changes?
Golo comes from the research activities of the Dynamid team of the CITI-INRIA Laboratory at INSA-Lyon. After experimentations in the JooFlux dynamic aspect and code injection toolkit, we realized that we could take advantage of the invokedynamic
/ JSR 292 to design a small, efficient and easy to hack dynamically-typed programming language for the JVM. By "easy to hack", we mean that language and runtime experiments can be approached by students and hobbyists, not just programming language design experts.
We released the first preview of Golo at the Devoxx France conference in March 2013. The language was presented in various JUGs and conferences, including De
Caveat: I am not a lawyer.
I understand that asking you to give up ownership of something may sound weird or pushy. Legal documents are scary, and can be fraught with unintended consequences if they're entered into lightly. I hope that I can shed some light on why a project would do so, since I've been through this with several projects I maintain.
You need to permit sublicensing and re-licensing so that if you die, the project doesn't have to track down your heirs to sign off on any license changes. (Sadly not an unrealistic or particularly uncommon situation.) Remember, IP laws do change, sometimes in ways that change the spirit of licenses, or make them insufficient or suboptimal to protect the freedoms that they were designed to protect. That's why licenses like the BSD 2-clause and ISC exist, because earlier licenses were no longer ideal for OSS projects using them.
It is completely reasonable for the project to require that you agree to give them – actually give them, all the way, without res
------------------------------------------------------- | |
T E S T S | |
------------------------------------------------------- | |
Running closure.CallClosureTest | |
CallClosureTest.groovy: [measured 5 out of 15 rounds, threads: 1 (sequential)] | |
round: 1.16 [+- 0.03], round.block: 0.00 [+- 0.00], round.gc: 0.00 [+- 0.00], GC.calls: 15, GC.time: 0.02, time.total: 18.18, time.warmup: 12.38, time.bench: 5.80 | |
CallClosureTest.java_unboxed: [measured 5 out of 15 rounds, threads: 1 (sequential)] | |
round: 0.24 [+- 0.01], round.block: 0.00 [+- 0.00], round.gc: 0.00 [+- 0.00], GC.calls: 7, GC.time: 0.01, time.total: 3.58, time.warmup: 2.38, time.bench: 1.20 | |
CallClosureTest.java_boxed: [measured 5 out of 15 rounds, threads: 1 (sequential)] | |
round: 0.25 [+- 0.01], round.block: 0.00 [+- 0.00], round.gc: 0.00 [+- 0.00], GC.calls: 8, GC.time: 0.01, time.total: 3.82, time.warmup: 2.55, time.bench: 1.27 |
module g0l0.patterns.creationnal.Singleton | |
local function _instance = -> null | |
local function _init = -> DynamicObject(): | |
testing(|this| -> println(this + "doing some stuff")) | |
function MyObject = { | |
if _instance() is null { |
module glloq | |
function boite = -> DynamicObject(): | |
op(""): | |
value(0): | |
nbCailloux(0): | |
nbAllumettes(0): | |
define("alumette", |this| { | |
if this: op(): equals("+") { this: nbAllumettes(this: nbAllumettes() + this: value())} | |
if this: op(): equals("-") { this: nbAllumettes(this: nbAllumettes() - this: value())} |
""" General | |
set nocompatible | |
set nobackup | |
""" Pathogen | |
filetype off | |
call pathogen#infect() | |
syntax on | |
filetype plugin indent on |