P ROGRAMMING L ANGUAGE S EMANTICS AS N ATURAL S CIENCE T HE P ECULIAR , E VOLVING , AND B ARELY C ONSUMMATED R ELATIONSHIP B ETWEEN S EMANTICS AND S CRIPTING L ANGUAGES Arjun Guha Joe Gibbs Politz Ben Lerner Justin Pombrio Shriram Krishnamurthi
"JavaScript ¡has ¡much ¡in ¡common ¡with ¡Scheme ¡[…] ¡ ( ) Because ¡of ¡this ¡deep ¡similarity ¡…" ¡ 2 ¡
function ¡bar(x) ¡{ ¡ function ¡bar(x) ¡{ ¡ ¡ ¡return ¡function() ¡{ ¡ ¡ ¡return ¡function() ¡{ ¡ ¡ ¡ ¡ ¡var ¡x ¡= ¡x; ¡ ¡ ¡ ¡ ¡var ¡x ¡= ¡x; ¡ ¡ ¡ ¡ ¡return ¡x; ¡ ¡ ¡ ¡ ¡return ¡x; ¡ ¡ ¡}; ¡ ¡ ¡}; ¡ } ¡ } ¡ ¡ ¡ var ¡f ¡= ¡bar(200); ¡ var ¡f ¡= ¡bar(200); ¡ f() ¡ f() ¡ à ¡200 ¡ � ¡undefined ¡ 3 ¡
var ¡x ¡= ¡0; ¡ var ¡y ¡= ¡900; ¡ ¡ function ¡baz(obj) ¡{ ¡ ¡ ¡with ¡(obj) ¡{ ¡ ¡ ¡ ¡ ¡x ¡= ¡y; ¡ ¡ ¡} ¡ } ¡ ¡ baz({ ¡y: ¡100 ¡}); ¡ x ¡ � ¡100 ¡ ¡ var ¡myObj ¡= ¡{ ¡x ¡: ¡0 ¡}; ¡ baz(myObj); ¡ x ¡ � ¡100 ¡ myObj.x ¡ � ¡900 ¡ 4 ¡
"JavaScript ¡has ¡much ¡in ¡common ¡with ¡Scheme ¡[…] ¡ Because ¡of ¡this ¡deep ¡similarity ¡…" ¡ No ¡help ¡to ¡researchers ¡ ¡ studying ¡Web ¡security, ¡ ¡ building ¡JavaScript ¡analyses, ¡ ¡ etc. ¡ 7 ¡
λ JS ¡(sort ¡of) ¡ on ¡one ¡slide ¡ 10 ¡
JavaScript ¡ λ JS ¡ desugar ¡ program ¡ program ¡ SpiderMonkey, ¡ definiMonal ¡ V8, ¡Rhino ¡ interpreter ¡ Iden%cal ¡for ¡ “their ¡ conformance ¡suites ¡ “our ¡ answer” ¡ answer” ¡ 11 ¡
What About the Spec? 1. The spec is embodied in the implementations 2. The spec is incomplete: e.g., SES depends on window.console 3. The spec depends on implementations! If […], the behavior of sort is implementation-defined. 4. Attackers attack implementations, not specs
Internal/ ¡ External ¡ validaMon ¡ 13 ¡
T WO WO P P OSITIONS OSITIONS 1. The desugar/semantics split is vital 2. Tests are a form of specification
JavaScript ¡ λ JS ¡ desugar ¡ program ¡ program ¡ 1. Curated ¡“essence”— provides ¡insight ¡ ¡ SpiderMonkey, ¡ 100 ¡LOC ¡ 2. Target ¡for ¡proofs ¡ V8, ¡Rhino ¡ interpreter ¡ 3. Target ¡for ¡tools ¡ ¡ 4. Stabilizes ¡quickly ¡and ¡ rarely ¡changes ¡aVer ¡ “their ¡ “our ¡ answer” ¡ answer” ¡ 5. What ¡we ¡as ¡scienMsts ¡ should ¡do ¡ 15 ¡
T ESTS ESTS AS AS S S PECIFICA TIONS PECIFICATIONS Tests are incomplete but formal Implementations on their own over-specify Tests keep up with evolution Tests ease the interface with specification authors
T HREE HREE R R ESEARCH ESEARCH P P ROBLEMS ROBLEMS
1. S 1. S HRINKING HRINKING D ESUGARING ESUGARING O O UTPUT UTPUT
let ¡(%context ¡= ¡%nonstrictContext) ¡{ ¡ ¡ ¡%defineGlobalAccessors(%context, ¡"n"); ¡ ¡ ¡%defineGlobalAccessors(%context, ¡"x"); ¡ ¡ ¡let ¡(#strict ¡= ¡false) ¡{ ¡ ¡ ¡ ¡ ¡try ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡%set-‑property( ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%ToObject( ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%context["x", ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}]), ¡ x["count"] ¡= ¡n ¡+ ¡1; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡"count", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%PrimAdd(%context["n" ¡, ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}], ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.)) ¡ ¡ ¡ ¡ ¡} ¡catch ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡%ErrorDispatch ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡} ¡ } ¡
let ¡(%context ¡= ¡%nonstrictContext) ¡{ ¡ ¡ ¡%defineGlobalAccessors(%context, ¡"n"); ¡ ¡ ¡%defineGlobalAccessors(%context, ¡"x"); ¡ ¡ ¡let ¡(#strict ¡= ¡false) ¡{ ¡ ¡ ¡ ¡ ¡try ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡%set-‑property( ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%ToObject( ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%context["x", ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}]), ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡"count", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡%PrimAdd(%context["n" ¡, ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}], ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.)) ¡ ¡ ¡ ¡ ¡} ¡catch ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡%ErrorDispatch ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡} ¡ try ¡{ ¡ } ¡ ¡ ¡%set-‑property( ¡ ¡ ¡ ¡ ¡%ToObject( ¡ ¡ ¡ ¡ ¡ ¡ ¡%context["x", ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}]), ¡ ¡ ¡ ¡ ¡"count", ¡ ¡ ¡ ¡ ¡%PrimAdd(%context["n" ¡, ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}], ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.)) ¡ } ¡catch ¡{ ¡ ¡ ¡%ErrorDispatch ¡ } ¡
try ¡{ ¡ ¡ ¡%set-‑property( ¡ ¡ ¡ ¡ ¡%ToObject( ¡ ¡ ¡ ¡ ¡ ¡ ¡%context["x", ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}]), ¡ ¡ ¡ ¡ ¡"count", ¡ ¡ ¡ ¡ ¡%PrimAdd(%context["n" ¡, ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}], ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.)) ¡ } ¡catch ¡{ ¡ ¡ ¡%ErrorDispatch ¡ } ¡ %set-‑property( ¡ ¡ ¡%ToObject( ¡ ¡ ¡ ¡ ¡%context["x", ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}]), ¡ ¡ ¡"count", ¡ ¡ ¡%PrimAdd(%context["n" ¡, ¡{[#proto: ¡null, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#class: ¡"Object", ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡#extensible: ¡true,]}], ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.)) ¡
Recommend
More recommend