MyAnalysis
/user/ ksen / Dropbox / jalangi2 / src / js /运行/ analysisCallbackTemplate。js,第101行
这个文件是编写定制的Jalangi 2分析的模板。简单地复制这个文件并重新编写您需要在分析中实现的回调。其他回调应该从文件中删除。
在以下方法中(也称为回调)可以选择不返回任何东西。如果所有的回调都没有返回任何值,那么我们就得到了一个被动的分析,其中具体的执行是未修改的,回调可以用来观察执行。您可以选择在一些回调中返回具有指定属性的适当对象,以修改具体执行的行为。例如,可以将从MyAnalysis#putFieldPre返回的对象的skip属性设置为true,从而跳过实际的putField操作。类似地,可以设置从MyAnalysis#write回调返回的对象的结果字段,以修改实际写入到变量的值。可以适当地设置从MyAnalysis#conditional回调返回的对象的结果字段,以更改程序执行的控制流。在MyAnalysis#functionExit和MyAnalysis#scriptExit中,可以将返回对象的isBacktrack属性设置为true,从头开始就重新执行函数的主体。结合改变程序控制流的能力,使我们能够在符号执行中探索函数的不同路径。
注意,如果调用process.exit(),则执行终止异常,并跳过MyAnalysis#endExecution的回调。
通过使用J$.smap中存储的全局对象,一个分析可以访问源映射,它将指令标识映射到源位置。Jalangi 2为运行时加载的每个JavaScript脚本分配了一个唯一的id,称为sid。J $.smap将每个sid映射到一个对象,称为iids,其中包含了id为sid的脚本的源映射信息。iid具有以下属性:
Ø originalCodeFileName:原始脚本文件的存储路径
Ø instrumentedCodeFileName:测试脚本文件的存储路径
Ø url:是可选的,并存储脚本的URL,如果它是在使用-URL选项的过程中设置的
Ø evalSid:存储eval被调用的脚本的sid,以备当前脚本来自eval函数调用
Ø evalIid:eval函数调用的iid,以防当前脚本来自eval函数调用
Ø nBranches:条件语句的脚本数量
Ø code:如果代码用-inlineSource选项进行了测试,那么将使用一个字符串来表示原始的脚本代码
Iids:还映射每个iid(代表指令id,分配给Jalangi2插入的每个回调函数的唯一ID)到包含[beginLineNumber, beginColumnNumber, endLineNumber, endColumnNumber]的数组。如果将代码用-inlineIID选项进行了测试,那么从iids到数组的映射仅可用。
在下面描述的每个回调中,iid表示脚本中回调的唯一静态指令id。在两个不同的脚本中插入的两个回调函数可能具有相同的iid。在一个回调函数中,可以使用J$.sid访问当前的脚本id。您可以调用J$.getGlobalIID(iid)来获得一个名为giid的字符串,该字符串静态地标识整个程序的回调。J$.getGlobalIID(iid)返回字符串J$.sid+“:”+iid。J$.iidToLocation(giid)返回一个字符串,包含原始脚本文件路径,开始和结束行号,和插入带有giid的回调的代码片段。
一些样本分析可以在../src/js/sample_analyses/找到。有关运行分析的说明,请参阅../README.md。
方法
_return (iid,val){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第385行
在使用return关键字从函数返回值之前调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
val * 要返回的值
Returns:
Type Description
Object | undefined - 如果返回一个对象,则返回的值将替换为存储在该对象的result属性中的值。
_throw (iid,val){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第397行
在使用throw关键字抛出一个值之前调用此回调函数。
Name Type Description
iid num 此回调的静态唯一指令标识符
val * 要抛出的值
Returns:
Type Description
Object | undefined - 如果返回一个对象,则抛出的值将替换为存储在该对象的result属性中的值。
_with (iid,val){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第409行
当执行with语句时 调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
val * 被用作with内容的值
Returns:
Type Description
Object | undefined -如果返回一个对象,with中的值将被替换为存储在该对象的result属性中的值。
binary(iid,op,left,right,result,isOpAssign,isSwitchCaseComparison,isComputed){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第513行
这个回调在二进制操作之后被调用。二进制操作包括+, - ,*,/,%,&,|,^,<<,>>,>>>,<,>,<=,> =,==,!=,=== ==,instanceof,delete,in。
Name Type Description
iid num 此回调的静态唯一指令标识符
op string 要执行的操作
left * 左操作数
right * 右操作数
result * 二进制运算的结果
isOpAssign boolean 如果二进制操作是表单的一部分则为真x op= e
isSwitchCaseComparison boolean 如果二进制操作是将判别式与switch语句中的结果进行比较的一部分,则为真。
isComputed boolean 如果操作是表单delete x[p],则为真,否则为false(即使表单的操作delete x.p)
Returns:
Type Description
Object | undefined - 如果返回一个对象,二进制操作的结果将替换为存储在对象的result属性中的值。
binaryPre (iid,op,left,right,isOpAssign,isSwitchCaseComparison,isComputed){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第491行
这个回调在二进制操作之前被调用。二进制操作包括+, - ,*,/,%,&,|,^,<<,>>,>>>,<,>,<=,> =,==,!=,=== ==,instanceof,delete,in。delete x 由于此操作无法反射执行,无回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
op string 要执行的操作
left * 左操作数
right * 右操作数
isOpAssign boolean 如果二进制操作是表单的一部分则为真x op= e
isSwitchCaseComparison boolean 如果二进制操作是将判别式与switch语句中的结果进行比较的一部分,则为真。
isComputed boolean 如果操作是表单delete x[p],则为真,否则为false(即使表单的操作delete x.p)
Returns:
Type Description
Object | undefined- 如果返回一个对象,并且 skip属性为true,则跳过二进制操作。如果返回对象,则原始op,left和right将被替换为返回的对象。
conditional(iid,result){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第555行
这种回调在分支之后进行条件检查后调用。分支可以发生在各种语句中,包括if-then-else,switch-case,while,for,||,&&,?
Name Type Description
iid num 此回调的静态唯一指令标识符
result * 条件表达式的值
Returns:
Type Description
Object | undefined - 如果返回对象,则条件表达式的结果将替换为存储在对象的result属性中的值。
declare (iid,name,val,isArgument,argumentIndex,isCatchParam){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第266行
这个回调函数在每个局部变量在范围内被定义的开始时被触发,对于每个正规的参数,对于每个使用函数语句定义的函数,对于arguments变量,以及在catch语句中传递的正式参数,都是如此。
Name Type Description
iid num 此回调的静态唯一指令标识符
name string 声明变量的名称
val * 声明的变量的初始值。变量可以是局部变量、函数参数、捕获参数、arguments或使用函数语句定义的函数。用var声明的变量是undefined类型(没被定义),不能通过从这个回调返回一个不同的值来更改。在函数执行的开始时,在参数变量上调用一个声明回调。
isArgument boolean 如果变量是参数或形式参数,则为真。
argumentIndex num 函数调用中参数的索引。指数从0开始。如果变量不是形式参数,则argumentIndex为-1。
isCatchParam boolean 如果变量是catch语句的参数,则为True。
Returns:
Type Description
Object | undefined - 如果函数返回一个对象,那么原始初始值将替换为存储在对象的result属性中的值。这不适用于使用var声明的局部变量。
endExecution (iid){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第601行
当node.js中执行终止时,调用此回调。在浏览器环境中,如果使用ChainedAnalyses.js或ChainedAnalysesNoCheck.js并按Alt-Shift-T,则调用回调。
Returns:
Type Description
undefined - 忽略任何返回值
endExpression (iid){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第592行
当一个表达式被计算并且其值被丢弃时,这个回调被调用。例如,当表达式语句完成其执行时,将调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
Returns:
Type Description
undefined - 忽略任何返回值
forinObject (iid,val){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第241行
当使用for-in循环来迭代对象的属性时,将调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
val * 其属性在for-in循环中迭代的对象。
Returns:
Type Description
Object |undefined - 如果函数返回一个对象,那么其属性正被迭代的原始对象将被存储在返回对象的result属性中的值替换。
例:
for (x in y) { }
// the above call roughly gets instrumented as follows:
var aret = analysis.forinObject(iid, y);
if (aret) {
y = aret.result;
}
for (x in y) {}
functionEnter (iid,f,dis,args){undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第422行
在函数体启动之前调用此回调函数。
Name Type Description
Iid num 此回调的静态唯一指令标识符
F funtion 将被执行函数体的function对象
dis * 函数体this的值
args array 被调用函数的参数列表
Returns:
Type Description
undefined - 忽略任何返回值
functionExit (iid,returnVal,wrappedExceptionVal){object}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第440行
当函数体的执行完成时,将调用此回调
Name Type Description
iid num 此回调的静态唯一指令标识符
returnVal * 该函数返回的值
wrappedExceptionVal Object |undefined 如果这个参数是一个对象,那么函数执行就会抛出一个未捕获的异常,异常被存储在参数的exception属性中。
Returns:
Type Description
Object --返回一个对象,那么实际的returnVal和wrappedExceptionVal.exception将被替换为返回的对象。如果返回一个对象并设置了属性isBacktrack,那么控制流将返回到函数体的开头,而不是返回给调用者。属性isBacktrack可以设置为true,以重复执行功能体,如同在MultiSE符号执行。
getField (iid,base,offset,val,isComputed,isOpAssign,isMethodCall){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第305行
在访问对象的属性后调用此回调。
Name Type Description
Iid num 此回调的静态唯一指令标识符
base * 基对象
offset string | * 属性
val * base[offset]的值
isComputed boolean 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o[p],则isComputed为真,如果get字段操作为o.p,则为false
isOpAssign Boolean 如果操作是form,则为真 o.p op= e
isMethodCall Boolean 如果get字段操作是方法调用的一部分(例如op()),则为True
Returns:
Type Description
Object |undefined- 如果返回一个对象,则get字段操作的值将替换为存储在该对象的result属性中的值。
getFieldPre (iid,base,offset,isComputed,isOpAssign,isMethodCall){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第286行
在访问对象的属性之前调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
base * 基对象
offset string | * 属性
isComputed boolean 如果使用方括号访问属性,则为true。例如, 如果get字段操作是o [p],则isComputed为真, 如果get字段操作为o.p,则为false
isOpAssign boolean 如果操作是form,则为真 o.p op= e
isMethodCall Boolean 如果get字段操作是方法调用的一部分(例如op()),则为True
Returns:
Type Description
Object |undefined - 如果返回对象并且对象的skip 属性为true,则跳过get字段操作。如果返回一个对象,则原始base和offset将从返回的对象替换。
instrumentCode (iid,newCode,newAst){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第581行
在字符串作为参数传递给eval或Function进行检测之后调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
newCode * 检测代码
newAst object 检测代码的AST(抽象语法树)
Returns:
Type Description
Object |undefined - 如果返回一个对象,则将检测到的代码替换为存储在对象的result属性中的值。
instrumentCodePre (iid,code){Object}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第568行
在作为参数传递给eval或Function进行检测的字符串之前调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
code * 将要检测的代码
Returns:
Type Description
Object - 如果返回一个对象,并且 skip属性为true,则跳过code检测。如果返回一个对象,原始code将被替换为返回的对象。
invokeFun (iid,f,base,args,result,isConstructor,isMethod,functionIid){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第188行
这个回调在函数、方法或构造函数调用后调用。
Name Type Description
iid num 此回调的静态唯一指令标识符
f function 被调用的函数对象
base * 函数f的接收对象
args array 传递给f的参数数组
result * 调用的返回值
isConstructor boolean 如果f被调用为构造函数,则为真
isMethod boolean 如果f被调用为方法,则为真
functionIid num 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符)。 functionIid可以被视为函数f的静态标识符。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的functionIid,这是在函数执行时传递给MyAnalysis#functionEnter的iid 。
Returns:
Type Description
Object |undefined - 如果返回一个对象,则调用的函数的返回值将被替换为存储在该对象的result属性中的值。这样可以更改实际函数调用返回的值。
例:
x = y.f(a, b, c)
// the above call roughly gets instrumented as follows:
var skip = false;
var aret = analysis.invokeFunPre(113, f, y, [a, b, c], false, true);
if (aret) {
f = aret.f;
y = aret.y;
args = aret.args;
skip = aret.skip
}
if (!skip) {
result =f.apply(y, args);
}
aret = analysis.invokeFun(117, f, y, args, result, false, true);
if (aret) {
x = aret.result
} else {
x = result;
}
invokeFunPre (iid,f,base,args,isConstructor,isMethod,functionIid){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第141行
这个回调在函数、方法或构造函数调用之前被调用。请注意,方法调用还会触发MyAnalysis#getFieldPre和 MyAnalysis#getField回调。
Name Type Description
Iid num 此回调的静态唯一指令标识符
f function 要调用的函数对象
base object 函数f的接收对象
args array 传递给f的参数数组
isConstructor Boolean 如果f被调用为构造函数,则为真
isMethod boolean 如果f被调用为方法,则为真
functionIid num 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符)。functionIid可以被视为该功能的静态标识符f。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的functionIid,这是在函数执行时传递给MyAnalysis#functionEnter的iid。
Returns:
Type Description
Object |undefined - 如果返回对象并且对象的skip属性为true,则跳过调用操作。如果返回对象,则原始f,base和args将被返回的对象替换。
例:
y.f(a, b, c)
// the above call roughly gets instrumented as follows:
var skip = false;
var aret = analysis.invokeFunPre(113, f, y, [a, b, c], false, true);
if (aret) {
f = aret.f;
y = aret.y;
args = aret.args;
skip = aret.skip
}
if (!skip) {
f.apply(y, args);
}
literal(iid,val,hasGetterSetter){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第216行
这个回调是在字面量创建之后调用的。字面量可以是function字面量,object字面量,array字面量,a number,a string,a boolean,a regular expression,null,NaN,Infinity, or undefined。
Name Type Description
iid num 此回调的静态唯一指令标识符
val * 字面量的值
hasGetterSetter boolean 如果文字是一个对象,并且对象定义了getter和setter,则为true
Returns:
Type Description
Object |undefined - 如果函数返回一个对象,那么原始文本值将替换为存储在对象的result属性中的值。
例
x = "Hello"
// the above call roughly gets instrumented as follows:
var result = "Hello";
var aret = analysis.literal(201, result, false);
if (aret) {
result = aret.result;
}
x = result;
onReady (cb)
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第632行
如果您的分析正在node.js上运行(即,通过direct.js或jalangi.js命令),onReady是有用的,并且需要在检测到的程序启动之前完成一些异步初始化。在这种情况下,初始化完成后,调用cb函数开始执行被检测的程序。请注意,这种回调在浏览器中无效,因为Jalangi无法控制检测程序何时运行。
Name Type Description
cb
putField (iid,base,offset,val,isComputed,isOpAssign){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第342行
在写入对象的属性后调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
base * 基对象
offset * 属性
val * 要存储base[offset]的值
isComputed boolean 如果使用方括号访问属性,则为true。例如,如果get字段操作是o[p],则isComputed为真,如果get字段操作为o.p,则为false
isOpAssign boolean 如果操作是形式,则为真 o.p op= e
Returns:
Type Description
Object |undefined - 如果返回对象,则put字段操作的结果将替换为存储在对象的result属性中的值。
putFieldPre (iid,base,offset,val,isComputed,isOpAssign){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第324行
在对象的属性写入之前调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
base * 基对象
offset * 属性
val * 要存储base[offset]的值
isComputed boolean 如果使用方括号访问属性,则为true。例如,如果get字段操作是o [p],则isComputed为真,如果get字段操作为o.p,则为false
isOpAssign boolean 如果操作是形式,则为真 o.p op= e
Returns:
Type Description
Object |undefined - 如果返回一个对象,并且skip 属性为true,则跳过put字段操作。如果返回一个对象,原始的base,offset和 val将被替换为返回的对象。
read (iid,name,val,isGlobal,isScriptLocal){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第357行
读取变量后调用此回调。
Name Type Description
iid num 此回调的静态唯一指令标识符
name string 正在读取的变量的名称
val * 从变量读取的值
isGlobal boolean 如果变量未使用var声明(如console),则为True
isScriptLocal boolean 如果变量在全局范围内使用var声明,则为true
Returns:
Type Description
Object |undefined - 如果返回一个对象,则读取操作的结果将替换为存储在对象的result属性中的值。
runInstrumentedFunctionBody (iid,f,functionIid){boolean}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第618行
仅当使用J$.Config.ENABLE_SAMPLING = true进行调用时才调用此回调。在执行函数、方法或构造函数的body之前调用此回调函数,如果返回true,则执行instrumented函数体,否则执行unlstrumented函数体。
Name Type Description
iid num 此回调的静态唯一指令标识符
f function 正在被执行的函数
functionIid num 当执行函数f时, 传递给回调MyAnalysis#functionEnter的iid(即唯一指令标识符)。functionIid可以被视为该功能的静态标识符f。请注意,给定的功能代码块可以创建几个函数对象,但每个这样的对象都有一个通用的functionIid,这是在函数执行时传递给MyAnalysis#functionEnter的iid 。
Returns:
Type Description
Boolean - 如果返回true则执行仪表功能体,否则执行未测量的功能体。
scriptEnter (iid,instrumentedFileName,originalFileName)
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第451行
在执行JavaScript文件之前调用此回调
Name Type Description
iid num 此回调的静态唯一指令标识符
instrumentedFileName string 检测脚本文件的名称
originalFileName string 原始脚本文件的名称
scriptExit (iid,wrappedExceptionVal){object}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第468行
当JavaScript文件的执行完成时,将调用此回调
Name Type Description
iid num 此回调的静态唯一指令标识符
wrappedExceptionVal Object|undefind 如果此参数是一个对象,则脚本执行会引发未捕获的异常,异常存储在参数的异常 属性中
Returns:
Type Description
Object --如果返回一个对象,那么实际的wrappedExceptionVal.exception将被替换为返回的对象。如果返回一个对象并设置了属性isBacktrack,那么控制流将返回到脚本正文的开头。属性 isBacktrack可以设置为true,以反复执行脚本体,就像MultiSE符号执行一样。
unary(iid,op,left,result){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第542行
这个回调在一次操作后调用。一元操作包括+, - ,〜,!,typeof,void。
Name Type Description
iid num 此回调的静态唯一指令标识符
op string 要执行的操作
left * 左操作数
result * 一次性操作的结果
Returns:
Type Description
Object |undefined - 如果返回一个对象,则一元操作的结果将替换为存储在对象的result属性中的值。
unaryPre (iid,op,left){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第527行
这种回调在一元操作之前被调用。一元操作包括+, - ,〜,!,typeof,void。
Name Type Description
iid num 此回调的静态唯一指令标识符
op string 要执行的操作
left * 左操作数
Returns:
Type Description
Object |undefined -如果返回一个对象,并且 skip属性为true,则跳过一元操作。 如果返回对象,则原始op和left将被替换为返回对象。
write (iid,name,val,lhs,isGlobal,isScriptLocal){Object | undefined}
/Users/ksen/Dropbox/jalangi2/src/js/runtime/analysisCallbackTemplate.js,第373行
在写入变量之前调用此回调函数。
Name Type Description
iid num 此回调的静态唯一指令标识符
name string 正在读取的变量的名称
val * 要写入变量的值
lhs * 在写入操作之前存储在变量中的值
isGlobal boolean 如果变量未使用var声明(如console),则为True
isScriptLocal boolean 如果变量在全局范围内使用var声明,则为真
Returns:
Type Description
Object |undefined -如果返回对象,则写入操作的结果将替换为存储在对象的result属性中的值。